我需要理解下面的代码。
join()
方法从两个不同的地方调用。
第二种连接方法有什么影响?
我们可以将其组合在一个连接方法中并在列表中获取结果吗?
CompletableFuture.allOf(futureList.toArray(new CompletableFuture[futureList.size()])).join();
for(CompletableFuture c: futureList){
processedDtoIdList.add((Long)c.join());
}
提前致谢。
在我看来,第二个
.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());
}
CompletableFuture.allOf
返回一个新的 CompletableFuture,当所有给定的 CompletableFuture 完成时,该 CompletableFuture 也完成。
[…]
此方法的应用之一是在继续执行程序之前等待一组独立的 CompletableFuture 完成,如:
。CompletableFuture.allOf(c1, c2, c3).join();
CompletableFuture.join
完成时返回结果值,如果异常完成则抛出(未经检查的)异常。
Future.resultNow
返回计算结果,无需等待。
此方法适用于调用者知道任务已成功完成的情况,例如,在过滤 Future 对象流以查找成功任务并使用映射操作来获取结果流时。
- 如果任务尚未完成或任务未完成且没有结果IllegalStateException