Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 等待一个完整的未来的所有结果,并根据这些价值观采取行动?_Java_Multithreading_Concurrency_Completable Future - Fatal编程技术网

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

我正在寻找在Java中异步运行一些任务的最佳方法,计算一些值,并在收集完这些值后,对它们运行进一步的计算

我以为我走的路是对的

    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
vs
runAsync
,我猜。

你做了
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是的,请参见编辑。这就是你要找的吗?