invokeAll()vs Guava ListenableFuture + addCallback()

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)