Igo*_*nko 5 java concurrency future cancellation
我正在尝试Future<>在我的项目中实现接口。但看起来文档对此有点模糊。
从官方文档我们可以推断出:
文档说
此方法返回后,对 isDone() 的后续调用将始终返回 true。
但
boolean isDone() 如果此任务完成,则返回 true。
因此,如果我们在任务正在处理且无法取消时运行 cancel(),则此方法应等到任务完成。这与 1 相矛盾。
cancel() 的返回值描述为
返回: 如果任务无法取消,则返回 false,通常是因为它已经正常完成;否则为真
所以,如果任务正在运行并且有可能被取消,但不是在这个确切的时刻,我们应该返回 true(我们不能声明它不能被取消)或等待(但它与 1 矛盾)。
但也有说法
如果此方法返回 true,则对 isCancelled() 的后续调用将始终返回 true。
但
boolean isCancelled() 如果此任务在正常完成之前被取消,则返回 true。
如果我们在任务运行时运行 cancel() 并且不能说任务是否可以取消,这与 3 相矛盾(因为在这种情况下 cancel() 应该返回 true,但 isCancelled() 应该返回 false)。
看起来这个 API 已经被开发很久了,这种不一致不应该出现在文档中。但是有。我是否理解错误?
我是否理解错误?
我相信是这样。Future不是作业控制 API;它是对可能尚未计算的值概念的抽象。通过取消,Future您只需放弃对该价值的兴趣;其余的取决于实施细节。
因此,Future与最终产生结果的计算没有强耦合。如果您调用cancel并返回true,则已将 移至Future其最终的、不可更改的状态:已取消的状态Future,该状态永远不会产生其值。底层计算任务可能会或可能不会持续不确定的时间;您无法通过 的 API控制它Future。
| 归档时间: |
|
| 查看次数: |
1387 次 |
| 最近记录: |