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

Другие вопросы по тегам