ホームページ  >  記事  >  Java  >  Java の待機と通知を使用すると IllegalMonitorStateException が発生するのはなぜですか?

Java の待機と通知を使用すると 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 に追加します。
  • 「ランナーの準備ができました」を出力した後、notifyAll() を呼び出してすべてのスレッドに通知します。

Runner.java

  • run() メソッドで、各ランナーは wait() 条件に入り、メインスレッドからの通知を待ちます。

問題は、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 の待機と通知を使用すると IllegalMonitorStateException が発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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