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!