Облегченный способ ожидания группы асинхронных вызовов Java - PullRequest
8 голосов
/ 08 февраля 2011

Мы пишем некоторый код в виде единого метода блокировки, который асинхронно вызывает несколько медленных сторонних сервисов.Эти асинхронные вызовы заключены в код, который реализует тот же метод интерфейса.Мы хотим отключить асинхронные вызовы и подождать, пока они все не вернутся, прежде чем возвращать наш метод блокировки.

Надеюсь, это понятно!

Существует ли подходящий шаблон / библиотека для реализацииэто ... это должно быть довольно распространенная картина.Заранее спасибо.

Ответы [ 2 ]

9 голосов
/ 08 февраля 2011

Можно использовать CountDownLatch, инициализированный числом асинхронных вызовов, и каждый асинхронный обработчик уменьшает защелку. «Внешний» метод блокировки просто «ждет» полного обратного отсчета, например ::1004

// Untested, Java pseudocode...
public void awaitAllRemoteCalls() {
    final CountDownLatch allDoneSignal = new CountDownLatch(N);
    // For each remote N calls...
    thirdPartyAsyncCall.call(new AsyncHandler(Object remoteData) {
        // Handle the remote data...
        allDoneSignal.countDown();
    });
    allDoneSignal.await();
}
2 голосов
/ 08 февраля 2011

Я не уверен, как у вас дела, но у меня есть все, что запускает асинхронные задачи (предпочтительно с использованием Executor), возвращающее Future<?> для каждой запускаемой задачи.Тогда вам просто нужно поместить все Future<?> в Collection и выполнить итерацию по нему, вызывая get():

List<Future<?>> futures = startAsyncTasks();
for (Future<?> future : futures) {
  future.get();
}
// all async tasks are finished

Я здесь исключил обработку исключений для get(),но это общая идея.

...