9

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

我希望这很清楚!

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

4

2 回答 2

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();
}
于 2011-02-08T20:10:36.290 回答
2

我不确定你是如何做事的,但我会让任何启动异步任务(最好使用 a Executor)为你启动的每个任务返回 a Future<?>。然后,您只需将所有Future<?>s 放入 aCollection并遍历它调用get()

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

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

于 2011-02-08T20:16:45.060 回答