Java の待機と通知: IllegalMonitorStateException について
Java では、待機メソッドと通知メソッドを使用してスレッドの実行を同期できます。ただし、これらのメソッドを誤って使用すると、IllegalMonitorStateException が発生する可能性があります。
その理由を理解するために、提供されたコードを分析してみましょう:
Main.java
Runner.java
問題は、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