Java Wait と Notify: IllegalMonitorStateException について
マルチスレッド プログラミングでは、wait() メソッドと Notify() メソッドを使用してスレッドのアクションを調整できます。ただし、これらのメソッドを誤って使用すると、IllegalMonitorStateException が発生する可能性があります。
指定されたコード スニペットでは、Main クラス内で、Main.main の wait() を呼び出そうとしています。ただし、IllegalMonitorStateException が発生します。これは、現在のスレッド (メイン スレッド) が Main.main オブジェクトのロックを保持していないためです。
この問題に対処するには、wait() が呼び出されるコード ブロックを同期する必要があります。これは、待機するオブジェクトに対して synchronized(...) ブロックを使用することで実現できます。この場合、それは Main.main オブジェクトです:
<code class="java">public void run() { try { synchronized (Main.main) { Main.main.wait(); } } catch (InterruptedException e) {} System.out.println("Runner away!"); }</code>
Main.main オブジェクトで同期することにより、待機を実行する前に現在のスレッド (ランナー スレッド) がオブジェクトのロックを確実に取得します。 ()。 NoticeAll() が Main クラスから呼び出されると、すべてのランナー スレッドに通知が送られ、実行を続行できます。
同じ原則が、notify() メソッドと NotifyAll() メソッドに適用されます。これらは、同期されたオブジェクトのロックを保持するスレッドによってのみ呼び出すことができます。
以上がJava で「wait()」を使用すると「IllegalMonitorStateException」が発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。