Java 待機と通知: IllegalMonitorStateException の克服
Java で待機と通知を実装しようとすると、とらえどころのない IllegalMonitorStateException が発生しました。このエラーは、現在のスレッドが、呼び出されるオブジェクトに関連付けられたモニターを所有していないことを示します。
待機および通知の所有権について
の Javadoc に記載されているとおりwait() を実行するには、そのオブジェクトに対して wait() を実行する前に、スレッドがそのオブジェクトのモニターを所有している必要があります。同様に、notify() および NoticeAll() オペレーションでも、呼び出しスレッドがモニターを所有する必要があります。
ランナー クラスへの同期の適用
IllegalMonitorStateException を解決するには、次のようにします。 wait() を実行する前に、現在のスレッドが Main オブジェクトのモニターを所有していることを確認する必要があります。これは、次のように Runner クラスの run() メソッドを同期することで実現できます。
<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.main で同期することで、現在のスレッドが実行前に Main オブジェクトのモニターを確実に取得します。待って()。これにより、IllegalMonitorStateException が発生することなく、通知を正常に待つことができます。
スレッド所有権に関する注意
Java では、スレッドは同期実行時にオブジェクトのモニターの所有権を取得します。そのオブジェクトのブロックまたは同期されたメソッド。実行が同期されたブロックまたはメソッドから離れると、所有権が解放されます。
以上がJava の Wait and Notify を使用すると IllegalMonitorStateException が発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。