当前位置: 首页 > 知识库问答 >
问题:

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

萧展鹏
2023-03-14

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

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

我已经得到了这个工作,但我需要做一些整理逻辑,当所有这些未来完成。但我对这一过程中产生的额外的可完成的未来感到困扰。

我会用什么方法来保存所有开始的CompletableFutures+那些动态创建的,并且在执行任何附加逻辑之前有一种方法来等待它们全部完成的。

共有1个答案

都飞跃
2023-03-14

您可以尝试从每个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.
 类似资料:
  • 想改进这个问题吗 通过编辑这篇文章,更新问题,以便用事实和引文来回答。 我调用一个方法,该方法为列表中的每个元素返回一次未来 返回的方法是库代码,我无法控制该代码的运行方式,我所拥有的只是。 我想等待所有完成(成功或失败),然后再继续。 有没有比这更好的方法: 对于好奇的人: 与这个等待未来列表的答案不同,我无法控制创建未来的代码。

  • 是否有一种方法可以在不阻塞事件循环的情况下等待一个未来完成? 我知道这个错误通常意味着什么,但我不知道在这种情况下...我试图在谷歌上搜索它,但没有找到任何关于将哪份清单放在哪里的明确解释。和以前一样,除非是强制性的,我更喜欢一次学一件事。 那么,回到这个问题:“基本”Vert.x是否有一种方法可以在事件循环不受干扰的情况下等待未来?

  • 是否有一种方法可以尝试等待一段时间,然后返回不同的结果,而不取消超时后的未来? 我有一个服务(我们称之为),它跑出去做自己的事情。它返回一个结果: 我愿意[阻止并]等待它一小段时间(比方说2秒)。如果它没有完成,我希望返回一个不同的结果,但我希望服务继续做它自己的事情。然后查询服务是否完成(例如,通过websockets或其他方式)将是客户端的工作。 即。我们有以下几个案例: 花费%1 s并完成其

  • 问题内容: 我有一个调用一些不检查线程中断的代码。调用之后,该方法将立即抛出(如预期的那样)。但是,由于后台任务的代码从不检查其线程是否被中断,因此它很乐意继续执行。 是否有等待后台任务 实际 完成的标准方法?我希望显示“正在取消…”消息或某种类似的内容,直到任务终止为止。(我确信如果有必要,我总是可以在worker类中使用一个标志来完成此操作,只需寻找其他解决方案即可。) 问题答案: 我玩了一点

  • 我想要一个完整的未来,只发出完成的信号(例如,我没有返回值)。 我可以将CompletableFuture实例化为: 但是我应该向完整的方法提供什么呢?例如,我不能做

  • 问题内容: 我通过将操作拆分为可用的确切内核数来并行化操作,然后通过启动相同数量的AsyncTask,对数据的不同部分执行相同的操作。 我正在使用以并行化它们的执行。 我想知道每个线程何时完成其工作,以便结合所有结果并执行进一步的操作。 我能怎么做? 问题答案: 您还可以简单地将共享库中的计数器递减作为的一部分。由于在同一线程(主线程)上运行,因此您不必担心同步。 更新1 共享对象可能看起来像这样