2012-02-17 103 views
12

任何人都可以指向我的一些文档,明确表示'Future.get`超时为0不会等待?future.get的行为与0超时

的API文档未明确future.get(0, unit)的行为。声称“在最多特定时间等待,如果必要的话......”意味着这种调用不会等待,但考虑到长期以来的行为(无限等待),我很紧张依赖于对future.get(0, unit)

“不等待”的行为扫描一些JDK提供的类(即FutureTask)我看到,当超时为0

我的Future这个特定的实现不等待的源d喜欢能说

long timeout = Math.max(until - now, 0); 
    return future.get(timeout, TimeUnit.MILLISECONDS); 

但我对一个未来感到紧张实施根据无限等待,所以反而,我已经明确地编码它,我希望它的工作方式:

long timeout = Math.max(until - now, 0); 
    if(timeout > 0 || future.isDone()){ 
     return future.get(timeout, TimeUnit.MILLISECONDS); 
    } else { 
     throw TimeoutException(); 
    } 
+0

@skaffman感谢标签修复。 – mwhidden 2012-02-17 18:05:45

回答

7

如果需要,至多等待给定的时间...... hellip;

最多零时间单位等待不候的。这不是一个隐含的暗示,而是一个明确的保证。

+3

授予。我认为这种与Object.wait(long)语义的区别应该保证在文档中做出明确的区分。即使'Object.wait'起初似乎也保证没有等待“'超时” - 以毫秒为单位等待的最长时间“,但是后退并说”如果超时“为零,则不考虑实时性,该线程只是等待通知。“ – mwhidden 2012-02-17 18:03:16

5

我可以在一些代码点,你有没有什么帮助。展望java.util.concurrent.FutureTask,然后到AbstractQueuedSynchronizer我看到下面的循环,我已经简化到显示relavent位:

private boolean doAcquireSharedNanos(int arg, long nanosTimeout) { 
    long lastTime = System.nanoTime(); 
    for (;;) { 
     ... 
     if (nanosTimeout <= 0) { 
      cancelAcquire(node); 
      return false; 
     } 
     long now = System.nanoTime(); 
     nanosTimeout -= now - lastTime; 
    } 

这意味着,如果nanosTimeout为0(如果你在0传递给它会得到),那么它将尝试获得一次未来,然后超时并返回false。

如果它让你感觉更好,你可以设置你的超时时间为1纳秒。

+0

谢谢!这正是我在自己的研究中所审查的代码。 – mwhidden 2012-02-17 18:00:03