Java 等待每一个可完成的未来完成

Java 等待每一个可完成的未来完成,java,completable-future,Java,Completable Future,我试图做的是异步计算树结构的深度,我将有树的第一级,我想启动一个异步线程来分别计算每个节点的深度 在计算过程中,很明显树中可能有一个分支,在这一点上,我想踢一个额外的线程来计算这个分支 我已经得到了这项工作,但我需要做一些整理逻辑时,所有这些期货已经完成。但我对沿途产生的额外的可完成的未来感到困难 我将使用什么方法来保存所有开始的CompletableFutures+沿途动态创建的Futures,并在执行任何其他逻辑之前等待它们全部完成。您可以尝试从每个CompletableFutures获取一

我试图做的是异步计算树结构的深度,我将有树的第一级,我想启动一个异步线程来分别计算每个节点的深度

在计算过程中,很明显树中可能有一个分支,在这一点上,我想踢一个额外的线程来计算这个分支

我已经得到了这项工作,但我需要做一些整理逻辑时,所有这些期货已经完成。但我对沿途产生的额外的可完成的未来感到困难


我将使用什么方法来保存所有开始的CompletableFutures+沿途动态创建的Futures,并在执行任何其他逻辑之前等待它们全部完成。

您可以尝试从每个CompletableFutures获取一个值。如果某个值可用,请检查下一个值。如果当前值不可用,则在检查下一个值之前停止执行当前值。 您可以使用类似于以下内容的代码:

List<CompletableFuture<Integer>> myList = ...
for (CompletableFuture<Integer> c: myList) {
   Integer x = c.get();
   ...
}
// You arrive here only when all the CompletableFuture have returned a 
// value.
List myList=。。。
用于(可完成的未来c:myList){
整数x=c.get();
...
}
//只有当所有可完成的未来都返回一个新的起点时,你才会来到这里
//价值观。

如果不知道具体的用例或一些代码,很难说,但是您可以使用一个外部工具来跟踪深层次。比如:

CompletableFuture<Whatever> doStuff(..., int deep) {
  if(getCurrentDeep() < deep) setDeep(deep);
  // ...
  CompletableFuture<Whatever> stuff1 = doStuff(..., deep + 1);
  CompletableFuture<Whatever> stuff2 = doStuff(..., deep + 1);

  return stuff1.thenCombine(stuff2, (s1, s2) -> /* merge stuff */ )
}
CompletableFuture doStuff(…,int deep){
if(getCurrentDeep()/*合并填充*/)
}

另一方面,如果您可以使用Actor库(如Akka或Vertx)来遵循此方法,则会更好。

看看这个讨论可能会对您有所帮助。我认为最好提供简化的代码版本,以便更好地理解。从您的描述来看,您似乎只需要将
allOf()
thencomose()
正确组合。此外,对于生成任务/线程,您的策略有点不清楚。