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

Igo*_*nko 5 java concurrency future cancellation

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

官方文档我们可以推断出:

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

    此方法返回后,对 isDone() 的后续调用将始终返回 true。

    boolean isDone() 如果此任务完成,则返回 true。

    因此,如果我们在任务正在处理且无法取消时运行 cancel(),则此方法应等到任务完成。这与 1 相矛盾。

  3. cancel() 的返回值描述为

    返回: 如果任务无法取消,则返回 false,通常是因为它已经正常完成;否则为真

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

  4. 但也有说法

    如果此方法返回 true,则对 isCancelled() 的后续调用将始终返回 true。

    boolean isCancelled() 如果此任务在正常完成之前被取消,则返回 true。

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

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

Mar*_*nik 4

我是否理解错误?

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

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