游戏有点晚了,但为了完成......
与其“等待”所有任务完成,不如按照好莱坞的原则来思考,“不要打电话给我,我会打电话给你”——当我完成时。我认为生成的代码更优雅......
Guava 提供了一些有趣的工具来实现这一点。
一个例子:
将 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) {
// do something with all the results
}
@Override
public void onFailure(Throwable t) {
// log failure
}
});
这还提供了一个优势,即您可以在处理完成后将所有结果收集在一个地方......
更多信息在这里