CompletableFuture.allOf 抛出异常时取消其他期货
CompletableFuture.allOf cancel other futures when one throws exception
Java 8 的 CompletableFuture.allOf(CompletableFuture<?>...cfs)
将 return 一个 CompletableFuture
当所有给定的期货完成时完成,或者抛出 CompletionException
如果其中一个futures 异常完成。
如果我的一个 futures 异常完成,CompletableFuture.allOf
会在抛出 CompletionException
之前等待剩余的 futures 完成,还是会取消剩余的 futures?
如果它等待所有 futures 完成,有什么方法可以在任何 future 抛出异常时立即 return 并取消剩余的 futures?
If one of my futures completes with an exception, will CompletableFuture.allOf
wait for the remaining futures to complete before throwing the CompletionException
是的,它仍然会等待所有期货完成。
您可以使用此辅助方法创建一个 CompletableFuture
,一旦任何 futures 这样做,它就会异常完成。
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;
});
Java 8 的 CompletableFuture.allOf(CompletableFuture<?>...cfs)
将 return 一个 CompletableFuture
当所有给定的期货完成时完成,或者抛出 CompletionException
如果其中一个futures 异常完成。
如果我的一个 futures 异常完成,CompletableFuture.allOf
会在抛出 CompletionException
之前等待剩余的 futures 完成,还是会取消剩余的 futures?
如果它等待所有 futures 完成,有什么方法可以在任何 future 抛出异常时立即 return 并取消剩余的 futures?
If one of my futures completes with an exception, will
CompletableFuture.allOf
wait for the remaining futures to complete before throwing theCompletionException
是的,它仍然会等待所有期货完成。
您可以使用此辅助方法创建一个 CompletableFuture
,一旦任何 futures 这样做,它就会异常完成。
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;
});