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

CompletableFuture.allOf当一个期货抛出异常[duplicate]时取消其他期货

尚楚
2023-03-14

Java 8的< code > CompletableFuture . allof(CompletableFuture

如果我的一个期货异常完成,那么< code > completablefuture . allof 会在抛出< code>CompletionException之前等待其余期货完成,还是会取消其余期货?

如果它等待所有期货完成,有没有办法让它在任何期货抛出异常并取消剩余期货时立即返回?

共有1个答案

钱建本
2023-03-14

如果我的某个未来完成时出现异常,则它将<code>CompletableFuture。allOf等待剩余的期货完成,然后抛出<code>CompletionException

是的,它仍然会等待所有的期货完成。

您可以使用这个帮助器方法来创建一个< code>CompletableFuture,一旦任何期货异常完成,它就会异常完成。

public static CompletableFuture allOfTerminateOnFailure(CompletableFuture<?>... futures) {
    CompletableFuture<?> failure = new CompletableFuture();
    for (CompletableFuture<?> f: futures) {
        f.exceptionally(ex -> {
            failure.completeExceptionally(ex);
            return null;
        });
    }
    return CompletableFuture.anyOf(failure, CompletableFuture.allOf(futures));
}

如果您还想取消所有其他期货(如果其中一个期货异常完成),您可以在从此方法返回之前这样做:

failure.exceptionally(ex -> {
    Arrays.stream(futures).forEach(f -> f.cancel(true));
    return null;
});
 类似资料:
  • 我使用scala futures异步提交了1000份工作。我还实现了一个由并发阻塞队列支持的ThrottledExecutionContext,这样它一次最多只能运行100个作业,并将其余的放入队列中。这是一个阻塞操作,因为它涉及调用第三方服务本身。当其中一个抛出异常时,我需要重试整个操作(1000个作业)或者跳过整个批处理。当某些期货仍在运行时,我不能重试。我有办法知道在任何给定的时间点有多少作

  • 我有一个可完成期货的列表,我想从第一个期货开始,如果有任何完成例外,我想尝试列表中的下一个期货,依此类推,直到我耗尽了我所有的期货。如果任何一个期货成功了,我想就此止步,而不使用列表中的下一个期货。我如何做到这一点?到目前为止,我已经尝试过: 但是当我测试这种方法时,我看到当未来完成失败时,会抛出异常,并且不会尝试下一组期货。 编辑: 这就是样本的样子

  • 问题内容: 我要实现的混合,并且一旦所有要素都成功完成,返回的未来就成功完成,或者一旦任何要素都异常完成,它就异常地完成(相同的例外)。如果多个元素失败,则返回其中任何一个的异常就足够了。 用例 我有一个任务需要汇总由s 列表返回的子结果,但是一旦其中任何一个失败,该任务就应该停止等待。我知道子任务将继续运行,这没关系。 相关问题 我发现在“ 等待”列表上等待,最初看起来像是一个重复的问题,但被接

  • 在这种情况下,我的做法是使用 将 转换为 。然后使用 获取结果。但是,可能有一个任务需要很长时间并且超时。在这种情况下,我仍然希望获得其余结果(同时并行运行所有任务)。可能吗?怎么办? 谢谢

  • 我正在阅读Scala 2.11.8留档的函数在scala.concurrent.Future模块,它说: 将副作用函数应用于这个未来的结果,并返回一个包含这个未来的结果的新的未来。 这个方法允许强制回调以指定的顺序执行。 请注意,如果其中一个链式第四个回调引发异常,则该异常不会传播到后续的第四个调用。相反,随后的第四次回调将被赋予此未来的原始值。 我不确定< code >和不传播异常到底是什么意思

  • 所以我有一个方法,如果发生异常,我想在该方法中重试操作。如果第二次发生异常,我希望在另一个类调用该方法的地方捕获异常。这是正确的做法吗?