Join() 如何与 allOf() 方法一起使用以及与单个 CompletableFuture 对象一起使用时有什么区别

问题描述 投票:0回答:1

我需要理解下面的代码。

join()
方法从两个不同的地方调用。 第二种连接方法有什么影响? 我们可以将其组合在一个连接方法中并在列表中获取结果吗?

CompletableFuture.allOf(futureList.toArray(new CompletableFuture[futureList.size()])).join();
  for(CompletableFuture c: futureList){
     processedDtoIdList.add((Long)c.join());
 }

提前致谢。

java parallel-processing completable-future
1个回答
0
投票

在我看来,第二个

.join
调用只是为了从已完成的 future 列表中的
CompletableFuture
对象中获取实际值。

join
CompletableFuture.allOf
调用将等待所有期货完成。对
join
循环中每个单独 future 的
for
调用将在保证已完成的 future 上调用,因此将立即返回值而无需等待。

如果重写该方法以明确这一事实,使用

Future.resultNow
而不是
CompletableFuture.join

似乎该方法可能更容易理解
CompletableFuture.allOf(
        futureList.toArray(new CompletableFuture[futureList.size()])).join();

for(CompletableFuture c: futureList){
   processedDtoIdList.add((Long)c.resultNow());
}

或者,这里使用

CompletableFuture.allOf
似乎是多余的,因为单个期货可以在完成后加入并添加到列表中:

for(CompletableFuture c: futureList){
   processedDtoIdList.add((Long)c.join());
}

Java文档

CompletableFuture.allOf

返回一个新的 CompletableFuture,当所有给定的 CompletableFuture 完成时,该 CompletableFuture 也完成。

[…]

此方法的应用之一是在继续执行程序之前等待一组独立的 CompletableFuture 完成,如:

CompletableFuture.allOf(c1, c2, c3).join();

CompletableFuture.join

完成时返回结果值,如果异常完成则抛出(未经检查的)异常。

Future.resultNow

返回计算结果,无需等待。

此方法适用于调用者知道任务已成功完成的情况,例如,在过滤 Future 对象流以查找成功任务并使用映射操作来获取结果流时。

投掷:

IllegalStateException
- 如果任务尚未完成或任务未完成且没有结果

© www.soinside.com 2019 - 2024. All rights reserved.