首页  >  文章  >  Java  >  为什么在 Java 中使用 wait() 时会出现 IllegalMonitorStateException?

为什么在 Java 中使用 wait() 时会出现 IllegalMonitorStateException?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-01 05:25:02518浏览

Why Do I Get `IllegalMonitorStateException` When Using `wait()` in Java?

Java 等待和通知:了解 IllegalMonitorStateException

在多线程编程中,wait() 和 notify() 方法允许线程协调其操作。但是,错误地使用这些方法可能会导致 IllegalMonitorStateException。

在给定的代码片段中,在 Main 类中,您尝试在 Main.main 上调用 wait()。但是,您会遇到 IllegalMonitorStateException。这是因为当前线程(主线程)没有持有 Main.main 对象的锁。

要解决这个问题,需要同步调用 wait() 的代码块。这可以通过在要等待的对象上使用synchronized(...) 块来实现。在本例中,它是 Main.main 对象:

<code class="java">public void run() {
    try {
        synchronized (Main.main) {
            Main.main.wait();
        }
    } catch (InterruptedException e) {}
    System.out.println("Runner away!");
}</code>

通过在 Main.main 对象上进行同步,可以确保当前线程(运行程序线程)在执行等待之前获取该对象的锁()。当Main类调用notifyAll()时,所有运行线程都会收到通知并可以继续执行。

同样的原理也适用于notify()和notifyAll()方法。它们只能由持有同步对象锁的线程调用。

以上是为什么在 Java 中使用 wait() 时会出现 IllegalMonitorStateException?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn