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

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

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

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

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

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

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

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

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

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

  4. 但也有一个声明

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

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

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

看起来很久以前这个API已经被解除了,并且这些不一致不应该出现在文档中。 但那里有。 我不明白了吗?

我不明白了吗?

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

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

我读它为“isCancelled()在cancel()返回true后返回true”并且我看不到任何不一致