「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Java の待機と通知を使用すると IllegalMonitorStateException が発生するのはなぜですか?

Java の待機と通知を使用すると IllegalMonitorStateException が発生するのはなぜですか?

2024 年 11 月 14 日公開
ブラウズ:993

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

Java の待機と通知: IllegalMonitorStateException について

Java では、待機メソッドと通知メソッドを使用してスレッドの実行を同期できます。ただし、これらのメソッドを誤って使用すると、IllegalMonitorStateException が発生する可能性があります。

その理由を理解するために、提供されたコードを分析してみましょう:

Main.java

  • ]コンストラクター内で、メイン スレッドは複数のスレッドを作成し、それらを ArrayList に追加します。
  • 「ランナーの準備ができました」を出力した後、notifyAll() を呼び出してすべてのスレッドに通知します。

Runner.java

  • run() メソッドでは、各ランナーは wait() 条件に入り、メインスレッドからの通知を待ちます。

問題は、Runner.run() の wait() 呼び出しにあります。スレッドがオブジェクトに対して wait() を呼び出す場合、スレッドはそのオブジェクトのモニターを所有する必要があります。所有権はオブジェクトを同期することによって確立されます。

この問題を解決するには、wait() 呼び出し内で Main.main を同期します:

class Runner implements Runnable {
  public void run() {
    try {
      synchronized (Main.main) {
        Main.main.wait();
      }
    } catch (InterruptedException e) {}
    System.out.println("Runner away!");
  }
}

これにより、wait() 条件に入る前に、現在のスレッドが Main.main のモニターを所有することが保証されます。

同じ原則が、notify() と NoticeAll() に適用されます。これらのメソッドを発行する前に、スレッドはオブジェクトのモニターを所有している必要があります。

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3