ADJ*_*ADJ 1 java concurrency multithreading threadpool guava
我想知道使用ListenableFuture+addCallback()代替的优势是什么invokeAll(),以防万一我只想获得所有任务的结果.
是否invokeAll()隐藏了抛出的任何异常?如果我正在使用invokeAll(),我需要处理其他任何事情,作为addCallback()提供onSuccess()和onFailure()方法,但没有这样的功能invokeAll().
提前致谢!
Col*_*inD 10
使用ListenableFuture,您可以提交任意数量的任务,然后将ListenableFutures从这些任务传递给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);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3539 次 |
| 最近记录: |