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!