首先,这几乎是重复的: 如何区分等待(长时间超时)退出通知或超时?
但这是一个新的后续问题。
有这个等待声明:
public final native void wait(long timeout) throws InterruptedException;
它可能会因 InterruptedException 或超时而退出,或者因为在另一个线程中调用了 Notify/NotifyAll 方法,异常很容易捕获但是......
我的代码绝对需要知道退出是来自超时还是通知。(以后需要重新设计这段代码,但现在做不到。所以我需要知道退出等待的原因。)
具体来说,有人可以举一个使用仅在 notify() 上设置为 true 的 ThreadLocal 布尔值的示例,并且所有这些都在现有循环中,如下所示?(这或多或少是另一个线程中接受的答案,但没有给出具体的代码示例。我对 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();
}
布尔“空”的用途超出了我在这里提出的具体问题。我相信我需要添加另一个布尔值来满足原始问题的建议答案。我如何将该提议的解决方案集成到上面的现有代码片段中?谢谢。