首先,这是一个几乎重复的: How to differentiate when wait(long timeout) exit for notify or timeout?
但这是一个新的后续问题。
有这个等待声明:
public final native void wait(long timeout) throws InterruptedException;
它可能会因 InterruptedException 或超时而退出,或者因为在另一个线程中调用了 Notify/NotifyAll 方法,Exception 很容易捕获但是...
我的代码绝对需要知道退出是超时还是通知。 (以后这段代码需要重新设计,但是现在做不到,所以需要知道退出wait的原因。)
具体来说,有人可以给出一个示例,使用仅在 notify() 上设置为 true 的 ThreadLocal boolean 值,并且所有这些都在现有循环中,如下所示? (这或多或少是另一个线程中接受的答案,但没有给出具体的代码示例。我对 Java 不是很熟悉,所以我需要一个具体的代码示例——最好是在下面现有代码的上下文中.)
public synchronized int getLastSequenceNumber() {
while (empty) {
try {
wait(waitTimeValue);
} catch (InterruptedException e) {}
}
empty = true;
return reportedSequenceNumber;
}
public synchronized void reconcileLastSequenceNumber(int sequenceNumber) {
empty = false;
this.reportedSequenceNumber = sequenceNumber;
notifyAll();
}
boolean “空”的用途超出了我在这里提出的具体问题。我相信我需要添加另一个 boolean 值来完成原始问题的建议答案。我如何将建议的解决方案集成到上面的现有代码片段中?谢谢。
最佳答案
您最好使用 Condition
(及其 await
方法)而不是内置监视器,因为 await
返回一个 boolean
值,指示等待是否超时。
即便如此,您也必须提防虚假唤醒(这与调用 signal
无法区分。)
关于Java 监视器 : How to know if wait(long timeout) ended by timeout or by Notify()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6114320/