我想知道使用ListenableFuture+addCallback()
而不是invokeAll()
有什么好处,以防万一我只想一次获取所有任务的结果。invokeAll()
是否隐藏任何引发的异常?如果我使用invokeAll()
,我是否还要照顾其他事情,因为addCallback()
提供onSuccess()
和onFailure()
方法,但invokeAll()
没有此类功能。
提前致谢!
最佳答案
使用ListenableFuture
,您可以提交任意数量的任务,然后将这些任务中的ListenableFuture
传递给 Futures.allAsList
,获得另一个将在所有任务完成后完成的ListenableFuture
。还有 Futures.successfulAsList
,即使某些任务失败,该命令也会成功,并为每个失败的任务提供null
结果。
然后,您可以阻止当前线程等待这些结果(使用普通的Future.get()
),或者如果您不想/不需要阻止当前线程,则可以添加一个在完成时调用的监听器/回调。
例子:
ListeningExecutorService executor = ...
List<Callable<Foo>> tasks = ...
List<ListenableFuture<Foo>> futures = Lists.newArrayList();
for (Callable<Foo> task : tasks) {
futures.add(executor.submit(task));
}
final ListenableFuture<List<Foo>> resultsFuture
= Futures.allAsList(futures);
// block until all tasks are done
List<Foo> results = resultsFuture.get();
// or add a callback to get called when the tasks complete
Futures.addCallback(resultsFuture, new FutureCallback<List<Foo>>() {
@Override public void onSuccess(List<Foo> results) {
// ...
}
@Override public void onFailure(Throwable throwable) {
// ...
}
}, someExecutor);