gpt4 book ai didi

java - 当我执行 get 并抛出异常时,CompletableFuture 会自动取消吗?

转载 作者:行者123 更新时间:2023-11-30 05:27:41 25 4
gpt4 key购买 nike

我在代码中做了类似以下的事情。

CompletableFuture<FOObar> f =  doSomething();
Foobar foo = f.get(timeout, TimeUnit.MILLISECONDS);

如果get抛出任何Exception,无论是TimeoutException还是其他情况, future 会发生什么。是默认取消还是我应该这样做

try {
f.get(timeout, TimeUnit.MILLISECONDS);
}
catch {
f.cancel(true);
}

因此 future 被发布。如果我不明确取消, future 是否会卡在线程上,如果所有线程都陷入该状态,最终会导致饥饿

我需要阻止 get,因为我需要 foo 来执行进一步的逻辑。

最佳答案

根据 JavaDoc,调用 get(timeout, unit) 时,可能有 4 种异常(exception)情况:

  • CancellationException - 如果此 future 被取消
  • ExecutionException - 如果此 future 异常完成
  • InterruptedException - 如果当前线程在等待时被中断
  • TimeoutException - 如果等待超时

ExecutionException 是最直接的一个:future 异常完成,这通常意味着任务通过抛出异常而结束(但也可能意味着其他东西通过异常完成了 future) .

最后2个与get()调用本身的等待有关,它们仅表明抛出异常时future尚未完成。

CancellationException 表示 future 被 cancel()ed,但不表示作业是否仍在运行。

问题是调用 cancel(boolean)默认情况下,即使参数为 true,也不会取消正在运行的作业:

Parameters

mayInterruptIfRunning - this value has no effect in this implementation because interrupts are not used to control processing.

因此,默认情况下,是否调用 cancel() 并不重要,因为它不会影响正在运行的作业。

如果您想停止正在运行的作业,则必须在创建CompletableFuture(此处为doSomething())的方法中实现特定的机制来支持它。例如,它可以检查返回的 future 是否被取消,或者提供一些其他回调机制来停止执行(例如,通过在某处设置 stop 标志)。

关于java - 当我执行 get 并抛出异常时,CompletableFuture 会自动取消吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58230830/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com