Rumah  >  Artikel  >  Java  >  Mengapa Saya Mendapat IllegalMonitorStateException Apabila Menggunakan Wait and Notify Java?

Mengapa Saya Mendapat IllegalMonitorStateException Apabila Menggunakan Wait and Notify Java?

DDD
DDDasal
2024-10-31 16:16:57914semak imbas

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

Java's Wait and Notify: Understanding IllegalMonitorStateException

Di Java, tunggu dan maklumkan kaedah membenarkan urutan untuk menyegerakkan pelaksanaannya. Walau bagaimanapun, menggunakan kaedah ini secara tidak betul boleh membawa kepada IllegalMonitorStateException.

Untuk memahami sebabnya, mari analisa kod yang disediakan:

Main.java

  • Dalam pembina, utas utama mencipta berbilang utas dan menambahkannya pada ArrayList.
  • Selepas mencetak "Runners ready," ia memanggil notifyAll() untuk memberitahu semua thread.

Runner.java

  • Dalam kaedah run(), setiap pelari memasuki keadaan tunggu(), menunggu pemberitahuan daripada urutan utama.

Isunya terletak pada panggilan tunggu() dalam Runner.run(). Apabila benang memanggil wait() pada objek, ia mesti memiliki monitor objek itu. Pemilikan diwujudkan dengan menyegerakkan pada objek.

Untuk membetulkan isu, segerakkan pada Main.main dalam panggilan tunggu():

<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>

Ini memastikan bahawa utas semasa memiliki Utama. monitor utama sebelum memasuki keadaan tunggu().

Prinsip yang sama digunakan untuk notify() dan notifyAll(). Benang mesti memiliki monitor objek sebelum mengeluarkan kaedah ini.

Atas ialah kandungan terperinci Mengapa Saya Mendapat IllegalMonitorStateException Apabila Menggunakan Wait and Notify Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn