【发布时间】:2011-03-24 18:53:10
【问题描述】:
有这个等待声明:
public final native void wait(long timeout) throws InterruptedException;
它可能会因 InterruptedException 退出,也可能因超时而退出,也可能因为 Notify/NotifyAll 方法在另一个线程中被调用,Exception 很容易捕获,但是......
有什么方法可以知道退出原因是超时还是通知?
编辑:
这是一种可行的棘手方法,(尽管我不喜欢它)
long tBefore=System.currentTimeMillis();
wait(TIMEOUT);
if ((System.currentTimeMillis() - tBefore) > TIMEOUT)
{
//timeout
}
【问题讨论】:
-
我也有类似的需求,在我的情况下,
Semaphore更适合;如果超时已过,Semaphore.tryAcquire(long timeout, TimeUnit unit)返回false。 -
Semaphore 可以工作,除非您需要有等待的能力,这不受 Semaphore 公共合约的支持。
-
需要将条件改为(>=):
if ((System.currentTimeMillis() - tBefore) >= TIMEOUT) -
您的解决方案不正确。在通知事件之后,调度程序会在其他具有更高优先级的线程没有运行时恢复线程。这意味着,在通知之后,在线程恢复之前会出现一个时间间隔,如果它足以满足您的条件,您的代码会管理超时而不是正确的行为。
标签: java multithreading wait synchronized notify