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 サイトの他の関連記事を参照してください。