Rumah  >  Artikel  >  Java  >  Mengapa saya mendapat IllegalMonitorStateException apabila menggunakan wait() dan notify() dalam Java?

Mengapa saya mendapat IllegalMonitorStateException apabila menggunakan wait() dan notify() dalam Java?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-10-31 23:14:29458semak imbas

Why am I getting an IllegalMonitorStateException when using wait() and notify() in Java?

IllegalMonitorStateException dalam Java Tunggu dan Maklumkan

Memahami Tunggu dan Maklumkan

Kaedah wait() dan notify() untuk kelas Objek digunakan untuk komunikasi antara benang di Jawa. wait() menyebabkan utas panggilan menunggu sehingga utas lain memanggil notify() pada objek yang sama, melepaskan utas untuk meneruskan pelaksanaan.

IllegalMonitorStateException

IllegalMonitorStateException ialah dilemparkan apabila benang cuba menunggu pada objek tanpa memegang kunci intrinsiknya. Kunci ini diperoleh dengan menyegerakkan pada objek menggunakan blok atau kaedah yang disegerakkan.

Dalam Kod Disediakan

Kod yang anda berikan menghadapi pengecualian ini kerana kaedah wait() dipanggil tanpa menyegerakkan pada objek yang sesuai. Dalam kelas Runner, kaedah wait() dipanggil dalam kaedah run(). Walau bagaimanapun, kaedah run() tidak disegerakkan pada mana-mana objek.

Penyelesaian

Untuk membetulkannya, anda mesti menyegerakkan kaedah run() pada Main.main objek, iaitu objek yang menunggu() dipanggil. Ini memastikan bahawa utas semasa memegang kunci intrinsik pada Main.main sebelum cuba menunggu.

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

Penyegerakan ini memastikan bahawa utas semasa memperoleh kunci intrinsik pada Main.main sebelum memanggil tunggu(), menghalang IllegalMonitorStateException daripada dibuang.

Atas ialah kandungan terperinci Mengapa saya mendapat IllegalMonitorStateException apabila menggunakan wait() dan notify() dalam 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