首页  >  文章  >  Java  >  为什么在 Java 中使用 wait() 和 notification() 时会收到 IllegalMonitorStateException?

为什么在 Java 中使用 wait() 和 notification() 时会收到 IllegalMonitorStateException?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-10-31 23:14:29458浏览

Why am I getting an IllegalMonitorStateException when using wait() and notify() in Java?

Java Wait 和 Notify 中的 IllegalMonitorStateException

理解 Wait 和 Notify

wait() 和 notify() 方法Object 类用于 Java 中的线程间通信。 wait() 导致调用线程等待,直到另一个线程对同一对象调用 notification(),释放该线程继续执行。

IllegalMonitorStateException

IllegalMonitorStateException 是当线程尝试等待对象而不持有其内在锁时抛出。该锁是通过使用同步块或方法在对象上进行同步来获取的。

在提供的代码中

您提供的代码遇到此异常,因为 wait() 方法被调用时没有在适当的对象上进行同步。在 Runner 类中,在 run() 方法中调用 wait() 方法。但是,run() 方法未在任何对象上同步。

解决方案

要解决此问题,您必须在 Main.main 上同步 run() 方法object,这是调用 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>

此同步可确保当前线程在调用 wait() 之前获取 Main.main 上的内在锁,从而防止抛出 IllegalMonitorStateException。

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

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