等待一组异步Java调用的轻量级方法

时间:2011-02-08 19:49:40

标签: java asynchronous synchronous

我们在一个阻塞方法中编写了一些代码,它以异步方式调用多个慢速第三方服务。这些异步调用包含在实现相同接口方法的代码中。我们希望触发异步调用并等待它们全部返回,然后再返回阻塞方法调用。

我希望这很清楚!

是否有合适的设计模式/库来实现它......它必须是一个相当常见的模式。提前谢谢。

2 个答案:

答案 0 :(得分:9)

您可以使用初始化的CountDownLatch与异步调用的数量,并让每个异步处理程序递减锁存器。 “外部”阻塞方法只是“等待”完全倒计时,例如:

// 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();
}

答案 1 :(得分:2)

我不确定你是怎么做的,但我有任何启动异步任务(最好是使用Executor)为你开始的每项任务返回Future<?>。然后,您只需将所有Future<?>放入Collection并通过调用get()进行迭代:

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

我在这里遗漏了get()的异常处理,但这是一般的想法。