ホームページ > Java > &#&チュートリアル > Java で「wait()」を使用すると「IllegalMonitorStateException」が発生するのはなぜですか?

Java で「wait()」を使用すると「IllegalMonitorStateException」が発生するのはなぜですか?

Mary-Kate Olsen
リリース: 2024-11-01 05:25:02
オリジナル
656 人が閲覧しました

Why Do I Get `IllegalMonitorStateException` When Using `wait()` in Java?

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート