CompletableFuture.allOf 抛出异常时取消其他期货

aba*_*haw 3 java multithreading java-8 completable-future

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

如果我的一个期货异常完成,会CompletableFuture.allOf等待剩余的期货完成后再抛出CompletionException还是会取消剩余的期货?

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

Kir*_*nov 6

如果我的一个期货异常完成,将CompletableFuture.allOf等待剩余的期货完成,然后再抛出CompletionException

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

您可以使用此辅助方法创建一个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));
}
Run Code Online (Sandbox Code Playgroud)

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

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