Rumah  >  Artikel  >  Java  >  Mengapa Saya Mendapat `IllegalMonitorStateException` Apabila Menggunakan `wait()` dalam Java?

Mengapa Saya Mendapat `IllegalMonitorStateException` Apabila Menggunakan `wait()` dalam Java?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-01 05:25:02518semak imbas

Why Do I Get `IllegalMonitorStateException` When Using `wait()` in Java?

Java Wait and Notify: Memahami IllegalMonitorStateException

Dalam pengaturcaraan berbilang benang, kaedah wait() dan notify() membenarkan urutan menyelaraskan tindakannya. Walau bagaimanapun, menggunakan kaedah ini secara tidak betul boleh membawa kepada IllegalMonitorStateException.

Dalam coretan kod yang diberikan, dalam kelas Utama, anda cuba memanggil wait() pada Main.main. Walau bagaimanapun, anda menghadapi IllegalMonitorStateException. Ini kerana benang semasa (benang utama) tidak memegang kunci pada objek Utama.

Untuk menangani isu ini, anda perlu menyegerakkan blok kod tempat wait() dipanggil. Ini boleh dicapai dengan menggunakan blok disegerakkan(...) pada objek yang anda mahu tunggu. Dalam kes ini, ia ialah objek Utama.utama:

<code class="java">public void run() {
    try {
        synchronized (Main.main) {
            Main.main.wait();
        }
    } catch (InterruptedException e) {}
    System.out.println("Runner away!");
}</code>

Dengan menyegerakkan pada objek Utama.utama, anda memastikan bahawa benang semasa (benang pelari) memperoleh kunci pada objek sebelum melaksanakan penantian (). Apabila notifyAll() dipanggil daripada kelas Utama, semua urutan pelari akan dimaklumkan dan boleh meneruskan pelaksanaannya.

Prinsip yang sama digunakan untuk kaedah notify() dan notifyAll(). Ia hanya boleh dipanggil oleh benang yang memegang kunci pada objek yang disegerakkan.

Atas ialah kandungan terperinci Mengapa Saya Mendapat `IllegalMonitorStateException` Apabila Menggunakan `wait()` 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