Java 监视器 : How to know if wait(long timeout) ended by timeout or by Notify()?

标签 java multithreading wait 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 很容易捕获但是...

我的代码绝对需要知道退出是超时还是通知。 (以后这段代码需要重新设计,但是现在做不到,所以需要知道退出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/

相关文章:

c++ - 不要真正理解 std::atomic::compare_exchange_weak 和 compare_exchange_strong 的逻辑

C wait3() int* status 或 int* stat_loc

java - 使用 ThreadPoolExecutor 进行线程同步

java - Ant/ivy 脚本有助于删除具有阈值的旧 Artifactory

java - JPA 标准 API 按 NULL 最后排序

java - Eclipse 插件的跨项目版本控制

java - 将一串数字从已解析字符串的一部分更改为 int

c# - 按线程顺序同步线程对固定大小队列的访问

c++ - 使用 C++11 异步时 Libusb 挂起

java - 初学者关于Java多线程的问题以及synchronized block 和wait()/notify()的使用