Rumah  >  Artikel  >  Java  >  Bagaimanakah Anda Mengelakkan IllegalMonitorStateException Apabila Menggunakan Java\'s wait() dan notify()?

Bagaimanakah Anda Mengelakkan IllegalMonitorStateException Apabila Menggunakan Java\'s wait() dan notify()?

Barbara Streisand
Barbara Streisandasal
2024-11-02 10:13:30449semak imbas

How Do You Avoid IllegalMonitorStateException When Using Java's wait() and notify()?

Java Wait and Notify: Memahami IllegalMonitorStateException

Dalam Java, kaedah wait() dan notify() digunakan untuk menyegerakkan benang. Walau bagaimanapun, jika digunakan secara tidak betul, IllegalMonitorStateException boleh dihadapi.

Masalah

Coretan kod di bawah menunjukkan isu penyegerakan mudah:

<code class="java">class Main {
    // ...
    public void wait() {
        // ...
    }
    public void notifyAll() {
        // ...
    }
}

class Runner implements Runnable {
    public void run() {
        try {
            Main.main.wait();
        } catch (InterruptedException e) {
            // ...
        }
    }
}</code>

Dalam contoh ini, utas Runner cuba memanggil wait() pada objek Utama. Walau bagaimanapun, ini membawa kepada pengecualian kerana urutan Runner tidak memiliki monitor yang dikaitkan dengan objek Utama.

Memahami Kaedah Disegerakkan

Untuk menggunakan wait() dan maklumkan (), benang semasa mesti memiliki monitor objek yang disegerakkan. Ini boleh dicapai dengan menyegerakkan pada objek menggunakan kata kunci yang disegerakkan.

Penyelesaian

Untuk menyelesaikan isu ini, kelas Runner boleh diubah suai seperti berikut:

<code class="java">class Runner implements Runnable {
    public void run() {
        try {
            synchronized(Main.main) {
                Main.main.wait();
            }
        } catch (InterruptedException e) {
            // ...
        }
    }
}</code>

Dengan menambahkan blok disegerakkan di sekeliling panggilan tunggu(), benang Runner menjadi pemilik monitor objek Utama dan boleh melakukan operasi tunggu dengan selamat.

Memohon untuk memberitahuSemua

Prinsip yang sama digunakan untuk kaedah notify() dan notifyAll(). Mereka mesti dipanggil dari dalam blok disegerakkan objek yang disegerakkan. Oleh itu, kelas Utama boleh diubah suai seperti berikut:

<code class="java">class Main {
    // ...
    public synchronized void notifyAll() {
        // ...
    }
}</code>

Dengan memastikan pemilikan monitor yang betul, penggunaan wait() dan notify() boleh dilaksanakan dengan selamat untuk menyegerakkan benang dalam Java.

Atas ialah kandungan terperinci Bagaimanakah Anda Mengelakkan IllegalMonitorStateException Apabila Menggunakan Java\'s wait() dan notify()?. 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