Java の待機および通知: IllegalMonitorStateException について
Java では、待機および通知メソッドを使用してスレッドの実行を同期できます。ただし、これらのメソッドを誤って使用すると、IllegalMonitorStateException が発生する可能性があります。
その理由を理解するために、提供されたコードを分析してみましょう。
Main.java
Runner.java
問題は、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 サイトの他の関連記事を参照してください。