【问题标题】:Inconsistency in java.util.concurrent.Future?java.util.concurrent.Future 不一致?
【发布时间】:2010-06-03 15:20:04
【问题描述】:

为了争论,假设我正在为一个不可取消的任务实现FutureJava 6 API doc 说:

在 [cancel()] 返回后,对 isDone() 的后续调用将始终返回 true

[cancel()] 如果无法取消任务,则返回false,通常是因为它已经正常完成

它还说:

[isDone()] 如果此任务完成,则返回 true

但是如果我的取消失败不是因为任务已经完成,而是因为它根本无法取消,该怎么办?有没有办法摆脱这种矛盾(除了让我无法取消的任务可以取消并完全回避它)?

【问题讨论】:

  • 你错过了“完成”的资格:Completion may be due to normal termination, an exception, or cancellation -- in all of these cases, this method will return true.
  • 引用Future.cancel(boolean)也有关系:如果任务已经完成、已经被取消或不能被取消由于某些其他原因,此尝试将失败. 因此,无论出于何种原因未能取消似乎都是合法的。

标签: java concurrency future


【解决方案1】:

看来医生应该说

cancel() 返回true 后,对isDone() 的后续调用...

Javadocs 经常是完全错误和矛盾的,即使 10 年后,Sun 也常常懒得修复它们。仔细测试应始终补充文档。

【讨论】:

  • 我不会依赖“仔细测试”的输出作为文档的扩展。如果规范不具体,其他实现(包括同一 VM 的其他版本)可能会表现不同。如果您想安全,请严格遵守规范。
  • @Romain:当参考(和事实上的标准)实现不符合规范时,我不明白你怎么能说坚持规范是安全的。你的程序在 99% 的情况下都是错误的,但对于没人会使用的环境来说可能是正确的。
  • 我认为 99% 的时间都是广泛的戏剧化。规范通常没有错,但有时措辞很差且不精确。
  • @Romain:我并没有说(或者是说)规范在 99% 的情况下都是错误的,我是说当规范与 Sun 的实现不同时,您选择遵循规范,您的程序在 99% 的环境中都会出错,因为 Sun 的实现是事实上的标准。
猜你喜欢
  • 2013-06-17
  • 2012-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-16
  • 2015-04-25
相关资源
最近更新 更多