为什么调用CompletableFuture::cancel会导致立即的CancellationException.&l



我在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():

这个异常才被抛出

在完成时返回结果值,或者在完成异常时抛出(未检查的)异常

抛出:

CancellationException -如果计算被取消

您可以通过在示例代码中添加更多的print语句来看到这一点:
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)

相关内容

  • 没有找到相关文章

最新更新