游戏有点晚了,但是为了完成...
您可以按照好莱坞的原则,而不是“等待”完成所有任务,“完成后,不要叫我,我叫您”。我认为生成的代码更加优雅...
番石榴提供了一些有趣的工具来完成此任务。
一个例子 ::
将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);
        }
    });
这还提供了一个优势,即一旦处理完成,您就可以将所有结果收集在一个地方...
更多信息在这里