ホームページ  >  記事  >  Java  >  Java の Wait and Notify を使用すると IllegalMonitorStateException が発生するのはなぜですか?

Java の Wait and Notify を使用すると IllegalMonitorStateException が発生するのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-30 19:39:03795ブラウズ

Why Am I Getting an IllegalMonitorStateException When Using Java's Wait and Notify?

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。