future.get的行为与0超时
任何人都可以指向我的一些文档,明确表示'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();
}
如果需要,至多等待给定的时间...... hellip;
最多零时间单位等待不候的。这不是一个隐含的暗示,而是一个明确的保证。
授予。我认为这种与Object.wait(long)语义的区别应该保证在文档中做出明确的区分。即使'Object.wait'起初似乎也保证没有等待“'超时” - 以毫秒为单位等待的最长时间“,但是后退并说”如果超时“为零,则不考虑实时性,该线程只是等待通知。“ – mwhidden 2012-02-17 18:03:16
我可以在一些代码点,你有没有什么帮助。展望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纳秒。
谢谢!这正是我在自己的研究中所审查的代码。 – mwhidden 2012-02-17 18:00:03
@skaffman感谢标签修复。 – mwhidden 2012-02-17 18:05:45