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

Mou*_*inX 6 java multithreading notify wait

首先,这是一个近乎重复的: 如何区分等待(长时间超时)退出通知或超时?

但这是一个新的后续问题.

有这个等待声明:

public final native void wait(long timeout) throws InterruptedException;
Run Code Online (Sandbox Code Playgroud)

它可以通过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();
}
Run Code Online (Sandbox Code Playgroud)

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

fin*_*nnw 8

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

即使这样,你也必须警惕虚假的唤醒(与呼叫无法区分signal).