我正在尝试在我的项目中实现Future<>
接口。但看起来文档对它来说有点模糊。
从official documentation我们可以推断:
文档说
此方法返回后,后续调用isDone() 永远都会回归真实。
但
boolean isDone() 如果此任务完成,则返回true。
因此,如果我们在任务处理时运行cancel()并且无法取消,则此方法应该等到任务完成。这与1相矛盾。
cancel()的返回值描述为
返回:如果无法取消任务,则返回false,通常是因为它已经正常完成;否则
因此,如果任务正在运行并且可能被取消但不是在这个时刻,我们应该返回true(我们不能声明它不能被取消)或等待(但它与1相矛盾)。
但也有一个声明
如果此方法返回true,则对isCancelled()的后续调用将始终返回true。
但
boolean isCancelled() 如果此任务在正常完成之前被取消,则返回true。
当我们在任务运行时运行cancel()并且不能说任务是否可以被取消(因为在这种情况下cancel()应该返回true,但是isCancelled()应该返回时,这与3相矛盾假)。
看起来很久以前这个API已经被解除了,并且这些不一致不应该出现在文档中。但那里有。我不明白了吗?
答案 0 :(得分:2)
我将其读作&#34; isCancelled()在cancel()返回true后返回true&#34;而且我看不出任何不一致
答案 1 :(得分:2)
我是否理解错误的内容?
我相信。 Future
不是作业控制API;它是对可能尚未计算的值概念的抽象。通过取消Future
,您只需放弃对该值的兴趣;其余部分取决于实施细节。
因此,Future
与计算没有很强的耦合,最终会产生结果。如果您调用cancel
并返回true
,则您已将Future
移至其最终的,不可更改的状态:已取消Future
的状态,该状态永远不会产生其值。基础计算任务可能会持续或不会持续不确定的时间;您通过Future
的API 无法控制。