游戏有点晚了,但是为了完成...
您可以按照好莱坞的原则,而不是“等待”完成所有任务,“完成后,不要叫我,我叫您”。我认为生成的代码更加优雅...
番石榴提供了一些有趣的工具来完成此任务。
一个例子 ::
将ExecutorService包装到ListeningExecutorService ::中
ListeningExecutorService service = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10));
提交可调用的集合以执行::
for (Callable<Integer> callable : callables) {
ListenableFuture<Integer> lf = service.submit(callable);
// listenableFutures is a collection
listenableFutures.add(lf)
});
现在最重要的部分:
ListenableFuture<List<Integer>> lf = Futures.successfulAsList(listenableFutures);
将回调附加到ListenableFuture,可以在所有期货完成时通知您::
Futures.addCallback(lf, new FutureCallback<List<Integer>>() {
@Override
public void onSuccess(List<Integer> result) {
log.info("@@ finished processing {} elements", Iterables.size(result));
// do something with all the results
}
@Override
public void onFailure(Throwable t) {
log.info("@@ failed because of :: {}", t);
}
});
这还提供了一个优势,即一旦处理完成,您就可以将所有结果收集在一个地方...
更多信息在这里