首页  >  文章  >  Java  >  为什么在使用 Java 的 Wait 和 Notify 时会出现 IllegalMonitorStateException?

为什么在使用 Java 的 Wait 和 Notify 时会出现 IllegalMonitorStateException?

DDD
DDD原创
2024-10-31 16:16:57837浏览

Why Am I Getting IllegalMonitorStateException When Using Java's Wait and Notify?

Java 的等待和通知:了解 IllegalMonitorStateException

在 Java 中,等待和通知方法允许线程同步执行。但是,错误地使用这些方法可能会导致 IllegalMonitorStateException。

要了解原因,让我们分析一下提供的代码:

Main.java

  • 在构造函数中,主线程创建多个线程并将它们添加到一个ArrayList。
  • 打印“Runners ready”后,调用notifyAll()来通知所有线程。

Runner.java

  • 在 run() 方法中,每个 runner 都会进入 wait() 条件,等待 main 的通知

问题在于 Runner.run() 中的 wait() 调用。当线程对对象调用 wait() 时,它必须拥有该对象的监视器。所有权是通过同步对象来建立的。

要解决此问题,请在 wait() 调用中同步 Main.main:

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

这可确保当前线程拥有 Main。

同样的原理也适用于notify()和notifyAll()。在发出这些方法之前,线程必须拥有对象的监视器。

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

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