ホームページ  >  記事  >  Java  >  Java で wait() および Notice() を使用すると IllegalMonitorStateException が発生するのはなぜですか?

Java で wait() および Notice() を使用すると 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 and Notify の IllegalMonitorStateException

Wait and Notify について

の wait() メソッドと Notify() メソッドオブジェクト クラスは、Java のスレッド間通信に使用されます。 wait() を使用すると、呼び出し元のスレッドは、別のスレッドが同じオブジェクトの Notice() を呼び出すまで待機し、スレッドが解放されて実行を継続します。

IllegalMonitorStateException

IllegalMonitorStateException は、スレッドが固有ロックを保持せずにオブジェクトを待機しようとするとスローされます。このロックは、同期されたブロックまたはメソッドを使用してオブジェクトを同期することによって取得されます。

提供されたコード内

指定されたコードでは、wait() メソッドが原因でこの例外が発生します。適切なオブジェクトで同期せずに呼び出されます。 Runner クラスでは、run() メソッド内で wait() メソッドが呼び出されます。ただし、run() メソッドはどのオブジェクトでも同期されません。

解決策

これを修正するには、Main.main で run() メソッドを同期する必要があります。オブジェクト。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() および Notice() を使用すると IllegalMonitorStateException が発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。