Future.get(long,TimeUnit)的负向超时是否安全?

时间:2014-02-14 12:32:23

标签: java specifications java.util.concurrent

java.util.concurrent.Future.get(long, TimeUnit)提供否定超时是否安全?文档说

  

如果需要,最多等待计算完成的给定时间,然后检索其结果(如果可用)。

这是否意味着它可以使用负值,或者此声明仅涵盖非负面情况?我期望的行为是返回结果(如果可用)或立即超时。如果我们想要计算绝对时间点的超时并且已经过去,则可能发生这种情况。当然我可以使用max{timeout, 0},但这真的有必要吗?在我的环境中进行的测试表明它有效,但这有保证吗? https://stackoverflow.com/questions/9332904/behavior-of-future-get-with-0-timeout表明这应该是0超时的情况。

或者换句话说: 假设Future的结果可用。 Future的实现是否不合规,如果使用否定超时调用get(long, TimeUnit)除了返回此结果之外还会做什么呢?

1 个答案:

答案 0 :(得分:6)

一段时间不可能“等待”;唯一的理论保证是等待时间不低于某个数字。这实际上是在JLS中指定的。因此,措辞必须如下:

  

t 成为等待的给定时间,让 u 成为此方法在将控制权返回给调用者之前实际花费的时间。当且仅当 u < t ,方法调用的返回值保证为Future的返回值。

鉴于上述情况,负 t 完全按顺序排列,所有值< = 0应该完全相同。

尽管如此,一个实现可能会在一个负面的等待时间内抛出一个异常并且这样做的理由很弱。如果您的代码因此类异常而失败,您可能会与所述Future实施的作者展开激烈争执。如果发生这种情况,Stack Overflow实际上没有任何答案可以阻止它。

如果您随后到法院解决损害赔偿责任,并对此类诉讼的结果感兴趣,那么我认为这种担忧超出了Stack Overflow的范围。