gpt4 book ai didi

java - invokeAll() vs Guava ListenableFuture+addCallback()

转载 作者:行者123 更新时间:2023-11-29 09:54:48 24 4
gpt4 key购买 nike

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

关于java - invokeAll() vs Guava ListenableFuture+addCallback(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17887124/

24 4 0