Java 等待一个完整的未来的所有结果,并根据这些价值观采取行动?
我正在寻找在Java中异步运行一些任务的最佳方法,计算一些值,并在收集完这些值后,对它们运行进一步的计算 我以为我走的路是对的Java 等待一个完整的未来的所有结果,并根据这些价值观采取行动?,java,multithreading,concurrency,completable-future,Java,Multithreading,Concurrency,Completable Future,我正在寻找在Java中异步运行一些任务的最佳方法,计算一些值,并在收集完这些值后,对它们运行进一步的计算 我以为我走的路是对的 var f1 = CompletableFuture.supplyAsync(() -> Service.findPlayers(filter, maxCount, LeaderboardType.Unranked)); var f2 = CompletableFuture.supplyAsync(() -> Service.findPlay
var f1 = CompletableFuture.supplyAsync(() -> Service.findPlayers(filter, maxCount, LeaderboardType.Unranked));
var f2 = CompletableFuture.supplyAsync(() -> Service.findPlayers(filter, maxCount, LeaderboardType._1x1_RM));
var f3 = CompletableFuture.supplyAsync(() -> Service.findPlayers(filter, maxCount, LeaderboardType.TG_RM));
var x = CompletableFuture.allOf(f1, f2, f3);
直到我意识到不幸的是
allOf()
没有返回包含f1
、f2
和f3
结果的列表,而是void
?还有别的选择吗?否则,我必须将结果存储在某种“全局变量”中,然后从when()
调用中访问它们,这完全违背了使用supplyync
vsrunAsync
,我猜。你做了CompletableFuture::allOf
,就像你现在做的那样,但也要加入它:
CompletableFuture.allOf(f1, f2, f3).join();
然后你会:
Stream.of(f1, f2, f3)
.map(CompletableFuture::join)
.....
但是,由于功能已经完成,因此上述操作中没有加入
编辑
如果不想阻止,请执行以下操作:
var f1 = ...
var f2 = ...
var f3 = ...
CompletableFuture.allOf(f1, f2, f3)
.thenAccept(x -> {
f1.join();
f2.join();
f3.join();
})
方法
CompletableFuture.allOf()
不是void
方法。。。它返回一个可完成的未来
!因为allOf
方法没有联接,所以存在联接。这意味着任务仍然可以(异步)运行。或者,您可以先在allOf
方法返回的CompletableFuture
上join
。@Seelenvirtuose my bad,我没有提到allOf
之后的第一个join
。第一个join()调用不会阻止我的当前线程吗?@EngluseDelysum是的,请参见编辑。这就是你要找的吗?