Java监视器:如何知道等待(长时间超时)是否因超时或Notify()而结束?

首先,这是一个近乎重复的:
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很容易捕获但是…

我的代码绝对需要知道退出是从超时还是通知. (将来,这段代码需要重新设计,但现在无法完成.所以我需要知道退出等待的原因.)

具体来说,有人可以给出一个使用ThreadLocal布尔值的例子,该布尔值仅在notify()上设置为true,并且所有这些都在现有循环中,如下所示? (这或多或少是另一个线程中接受的答案,但没有给出具体的代码示例.我不熟悉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();
}

布尔“空”用于我在这里询问的特定问题之外的目的.我相信我需要添加另一个布尔值来满足原始问题的建议答案.我如何将提议的解决方案集成到上面的现有代码片段中?谢谢.

最佳答案
你可能最好使用Condition(及其await方法)而不是内置监视器,因为await返回一个布尔值,指示等待是否超时.

即便如此,你必须警惕虚假的唤醒(这与signal的调用无法区分)

转载注明原文:Java监视器:如何知道等待(长时间超时)是否因超时或Notify()而结束? - 代码日志