Java - Преобразование ожидания / уведомления в java.util.concurrent
У меня возникают трудности с преобразованием устаревших уведомлений о ожидании с ложными ожиданиями в API java.util.concurrent
Первая проблема: что использовать, Future или CountdownLatch или CyclicBarrier в соответствии с этим вопросом
Второй вопрос: как его использовать? Потому что во всех примерах, которые я рассмотрел, выполняется преобразование одного асинхронного метода в синхронизацию, что не является проблемой
В-третьих: Что является лучшим вариантом в моем случае из метода get будущей задачи, CountDownLatch или CyclicBarrier, поскольку у меня нет нескольких потоков, но только 2.
Мой асинхронный код
Основной класс:
public static void main(String[] args) throws InterruptedException {
Request req = new Request(1);
Thread tReq = new Thread(req);
tReq.start();
synchronized(req){
req.wait();
}
LogProperties.log.info("Response is: " + req.responseString);
}
Класс запроса:
public class Request implements Runnable {
private int requestID;
public boolean isComplete;
public String responseString;
public Request(int id) {
this.requestID = id;
}
@Override
public void run() {
FutureTest.hmTest.put(requestID, this);
try {
//simulate a request
Thread.sleep(10000);
} catch (InterruptedException ex) {
}
Response response = new Response(requestID);
Thread tResponse = new Thread(response);
tResponse.start();
}
}
Класс ответа:
public class Response implements Runnable {
int id;
public Response(int responseId) {
this.id = responseId;
}
@Override
public void run() {
Request req = (Request) FutureTest.hmTest.get(id);
req.isComplete = true;
req.responseString = "Request for id [" + id + "] has been completed";
synchronized(req){
req.notify();
}
}
}
Моя проблема с использованием будущих callable и CyclicBarrier заключается в том, что я не возвращаю переменную, я хочу дождаться объекта, который в данном случае имеет тип запроса, так что является лучшим решением
2 ответа
Одним из наиболее универсальных способов общения потоков является BlockingQueue
,
В вашем случае у вас есть один поток, который создает "ответ" (т. Е. Производитель), и у вас есть другой поток, который ожидает "ответ" (потребитель). Один из способов реализовать это для производителя put()
ответ в BlockingQueue, и есть потребитель take()
ответ из очереди.
take()
Операция неявно будет ожидать ответа, прежде чем он вернется.
Я думаю, что трубы могут быть идеальными для этого, они могут легко добиться синхронного общения.
Проверьте эту ссылку с трубами для производителя проблемы потребителей - http://www.informit.com/articles/article.aspx?p=26326&seqNum=10