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

Whether method cancel() in java.util.concurrent.Future should be blocking?

我正在尝试在我的项目中实现 Future<> 接口。但它的文档看起来有点模糊。

official documentation我们可以推导出:

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

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

    但是

    boolean isDone() Returns true if this task completed.

    所以如果我们在任务处理过程中运行 cancel() 并且不能被取消,这个方法应该等到任务完成。这与 1.

  3. 相矛盾
  4. cancel() 的 return 值描述为

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

    因此,如果任务是 运行ning 并且可能可以取消但不能在这个确切的时刻取消,我们应该 return true(我们不能声明它不能被取消)或等待(但它与 1 相矛盾)。

  5. 不过也有说法

    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() 当任务 运行ning 并且不能说是否可以取消任务时,这与 3 相矛盾(因为 cancel() 应该 return 在这种情况下为真,但 isCancelled() 应该 return 为假)。

看起来这个 API 很久以前就被删除了,这样的不一致不应该出现在文档中。但是那里有。我是不是理解有误?

我读作 "isCancelled() returns true after cancel() returned true",我看不出有任何不一致之处

Do I understand something incorrectly?

我相信是的。 Future 不是作业控件 API;它是对可能尚未计算的值概念的抽象。通过取消 Future,您只需放弃对该值的兴趣;剩下的取决于实现细节。

因此,Future 与最终会产生结果的计算没有强耦合。如果您调用 cancel 并且它 returns true,您已将 Future 移动到其最终的、不可更改的状态:已取消的 Future,它永远不会产生它的价值。底层计算任务可能会或可能不会持续不确定的时间;通过 Future 的 API.

,您无法控制