我想知道使用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);

10-08 17:05