【问题标题】:Wait for every CompletableFuture to complete等待每个 CompletableFuture 完成
【发布时间】:2018-11-08 05:57:29
【问题描述】:

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

在计算过程中,树中显然可能有一个分叉,此时我想启动一个额外的线程来计算该分支。

我已经完成了这项工作,但是当所有这些期货都完成后,我需要做一些整理逻辑。但是我遇到了沿途产生的额外 CompletableFutures 的问题。

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

【问题讨论】:

  • stackoverflow.com/questions/33944471/…这个讨论可能对你有帮助
  • 我认为最好提供一个简化版本的代码以便更好地理解。根据您的描述,您似乎只需要allOf()thenCompose() 的正确组合。此外,有点不清楚您生成任务/线程的策略是什么。

标签: java completable-future


【解决方案1】:

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

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.

【讨论】:

    【解决方案2】:

    如果不知道具体用例或一些代码,很难说,但您可以使用外部 AtomicInteger 来跟踪深度长度。比如:

    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 */ )
    }
    

    另一方面,如果您可以使用 Actor 库作为 Akka 或 Vertx 来遵循这种方法会更好。

    【讨论】:

      猜你喜欢
      • 2021-06-02
      • 2021-12-13
      • 2019-05-14
      • 2021-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多