2011-02-08 118 views
8

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

我希望这是明确的!

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

回答

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

我不知道你是如何做的事情,但我拥有的任何启动异步任务(最好使用Executor)为您开始的每项任务返回一个Future<?>。然后你只需要简单地把所有的Future<?> S IN一个Collection并反复通过它调用get()

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

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