java - CompletableFuture.allOf 在抛出异常时取消其他 future

标签 java multithreading java-8 completable-future

Java 8 CompletableFuture.allOf(CompletableFuture<?>...cfs) 将返回 CompletableFuture当所有给定的 future 完成时完成,或者抛出 CompletionException如果其中一个 future 完成时出现异常。

如果我的其中一个 future 完成时出现异常,将 CompletableFuture.allOf等待剩余的 future 完成后再抛出 CompletionException还是会取消剩余的 future ?

如果它等待所有 future 完成,有什么办法让它在任何 future 抛出异常时立即返回并取消剩余的 future 吗?

最佳答案

If one of my futures completes with an exception, will CompletableFuture.allOf wait for the remaining futures to complete before throwing the CompletionException

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

您可以使用此辅助方法创建一个 CompletableFuture,一旦任何 future 完成,它就会异常完成。

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));
}

如果您还想取消所有其他 future(如果其中一个 future 异常完成),您可以在从此方法返回之前执行以下操作:

failure.exceptionally(ex -> {
    Arrays.stream(futures).forEach(f -> f.cancel(true));
    return null;
});

关于java - CompletableFuture.allOf 在抛出异常时取消其他 future,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58491368/

相关文章:

c# - STAThread 属性是要求还是建议?

multithreading - Windows XP中每个线程时间片需要多长时间?

java - 使用配对键将三元组列表分组到映射中

java - 使用默认实现的空安全映射比较器

java - 如何解决 Servlet 执行抛出异常?

java - 我应该如何在 Java 中表示依赖关系图?

java - 如何将LinkedList中具有多种行为的行为显示在一行中

c++ - C++中的字符串逻辑错误

groovy - java.util.function.Predicate#and 和 Groovy 2.2 闭包

java - JFrame、JPanel、KeyListener 问题