gpt4 book ai didi

java - java.util.concurrent.Future 中的方法 cancel() 是否应该阻塞?

转载 作者:行者123 更新时间:2023-12-05 01:01:11 24 4
gpt4 key购买 nike

我正在尝试实现 Future<>我的项目中的界面。但看起来文档对此有点模糊。

来自 official documentation我们可以推断:

  • 方法cancel() 不会抛出像InterruptedException 或ExecutionException 这样的异常。此外,它没有超时的变体。所以看起来,它不应该阻塞。
  • 文档说

    After this method returns, subsequent calls to isDone() will always return true.





    boolean isDone() Returns true if this task completed.



    因此,如果我们在任务正在处理且无法取消时运行 cancel(),则此方法应等待任务完成。与 1 相矛盾。
  • cancel() 的返回值描述为

    Returns: false if the task could not be cancelled, typically because it has already completed normally; true otherwise



    所以,如果任务正在运行并且有可能被取消,但不是在这个确切的时刻,我们应该返回 true(我们不能声明它不能被取消)或等待(但它与 1 矛盾)。
  • 但也有说法

    Subsequent calls to isCancelled() will always return true if this method returned true.





    boolean isCancelled() Returns true if this task was cancelled before it completed normally.



    如果我们在任务运行时运行 cancel() 并且不能说任务是否可以取消,这与 3 相矛盾(因为在这种情况下 cancel() 应该返回 true,但 isCancelled() 应该返回 false)。

  • 看起来这个 API 已经被开发很久了,这种不一致不应该出现在文档中。但是有。我是否理解错误?

    最佳答案

    Do I understand something incorrectly?



    我相信是这样。 Future不是作业控制 API;它是对可能尚未计算的值概念的抽象。通过取消 Future您只需放弃对该值(value)的兴趣;其余的取决于实现细节。

    因此, Future与最终产生结果的计算没有强耦合。如果您调用 cancel它返回 true ,您已经移动了 Future到其最终的、不可更改的状态:被取消的状态 Future ,永远不会产生它的值(value)。底层计算任务可能会或可能不会持续不确定的时间;您无法通过 Future 控制它。的 API。

    关于java - java.util.concurrent.Future 中的方法 cancel() 是否应该阻塞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28691081/

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