【发布时间】:2009-12-29 16:51:36
【问题描述】:
我正在尝试根据TimeUnit.timedWait(Object, long) 来实现Future.get(long, TimeUnit)。
目前尚不清楚如何使用TimeUnit.timedWait(Object, long) 来处理虚假唤醒而不会丢失 TimeUnit 的纳秒组件。通常你会做这样的事情:
public V get(long timeout, TimeUnit unit)
{
long expirationTime = new Date().getTime() + unit.toMillis(timeout);
while (!condition)
{
long timeLeft = expirationTime - new Date().getTime();
if (timeLeft <= 0)
throw new TimeoutException();
unit.timedWait(object, timeLeft);
}
}
但是您丢失了纳秒部分。如果每个人都只是放弃纳秒组件,那么TimeUnit 甚至支持纳秒并提供TimeUnit.timedWait() 的意义何在?
【问题讨论】:
-
您能否说明您担心虚假唤醒的情况?代码中是否有某些内容难以明确谁在控制对象监视器?
-
我很确定谁在控制对象监视器。虚假唤醒是指即使没有人调用 notify() 或发生超时,wait() 操作也可能返回。
标签: java concurrency time-wait