使用这个等待声明:
public final native void wait(long timeout) throws InterruptedException;
它可以通过InterruptedException退出,或者通过超时退出,或者因为Notify/NotifyAll方法是在另一个线程中调用的,所以异常很容易捕获,但是...
有没有办法知道退出的原因是超时还是通知?
编辑:
这是一种可以工作的棘手方法(尽管我不喜欢它)
long tBefore=System.currentTimeMillis();
wait(TIMEOUT);
if ((System.currentTimeMillis() - tBefore) > TIMEOUT)
{
//timeout
}
发布于 2010-08-03 22:58:42
除非您提供一些额外的代码,否则您无法区分这两者。例如,通过添加仅在notify()
上设置为true
的ThreadLocal
Boolean
但首先,您必须确保您的逻辑需要这种区分。
发布于 2010-08-03 23:11:15
notify可以返回的另一个原因是:虚假唤醒。这不太可能,但却是可能的,因为在某些硬件/操作系统组合上,防止虚假唤醒是非常昂贵的。
因此,您必须始终在循环中调用wait(),并重新检查您正在等待的条件。在这项工作中,很容易同时检查超时。
有关详细信息,我推荐"Java并发实践“这本书。并使用更高级别的构造,这些构造将为您解决所有问题。
发布于 2010-08-03 23:01:04
这并没有确切地回答这个问题,但它可能会解决您的问题:使用更高级别的并发机制。等待/通知通常比您想要的更低级,这是许多其他原因中的一个原因。
例如,如果您使用的是BlockingQueue.poll(long, TimeUnit)
,则可以检查结果是否为null,以了解是否超时。
https://stackoverflow.com/questions/3397722
复制相似问题