我在CompletableFuture
上试着呼叫cancel
。
从文档来看:
如果还没有完成,用CancellationException完成这个CompletableFuture。依赖的尚未完成的CompletableFutures也会异常完成,并由这个CancellationException引起CompletionException。
它应该异常地完成它们,这是我所期望的,但相反,它抛出并立即CancellationException
下面是一个示例代码
CompletableFuture<?> f = CompletableFuture.supplyAsync(() -> false);
f.cancel(true); // Line 7.
f.join();
带repro: https://www.mycompiler.io/view/2v1ME4u
Exception in thread "main" java.util.concurrent.CancellationException
at java.base/java.util.concurrent.CompletableFuture.cancel(CompletableFuture.java:2396)
at Main.main(Main.java:7)
第7行是f.cancel(true);
行。
实际上不会立即抛出。
调用f.cancel(true)
导致CancellationException
被创建,捕获对cancel
调用的堆栈跟踪。因此,堆栈跟踪(因为未处理而被打印)包含f.cancel(true);
调用行。
但是直到f.join()
:
您可以通过在示例代码中添加更多的print语句来看到这一点:在完成时返回结果值,或者在完成异常时抛出(未检查的)异常
…
抛出:
CancellationException -如果计算被取消
CompletableFuture<?> f = CompletableFuture.supplyAsync(() -> false);
f.cancel(true); // Line 8.
try {
f.join();
} catch (CancellationException e) {
System.out.println("CancellationException was thrown at call to f.join()");
e.printStackTrace(System.out);
}
输出:
CancellationException was thrown at call to f.join()
java.util.concurrent.CancellationException
at java.base/java.util.concurrent.CompletableFuture.cancel(CompletableFuture.java:2396)
at Main.main(Main.java:8)