InterruptedException in Java - Penyelesaian kepada pengecualian gangguan benang
Dalam pengaturcaraan berbilang benang Java, pengecualian gangguan benang ialah masalah biasa dan masalah yang memerlukan perhatian. Apabila utas sedang berjalan dan utas lain mahu mengganggunya, InterruptedException dilemparkan. Artikel ini akan membincangkan punca dan penyelesaian InterruptedException.
InterruptedException ialah pengecualian yang dilemparkan kerana benang terganggu. Semasa thread sedang berjalan, thread lain boleh mengganggunya melalui kaedah interrupt(). Jika benang yang terganggu berada dalam keadaan menunggu, seperti menunggu operasi IO atau menunggu kunci, InterruptedException akan dilemparkan.
Sebagai contoh, dalam kod berikut, apabila utas t1 sedang melaksanakan Thread.sleep() untuk tidur, utas t2 mengganggunya, jadi t1 akan membuang pengecualian InterruptedException.
Thread t1 = new Thread(() -> { try { Thread.sleep(5000); } catch (InterruptedException e) { System.out.println("Thread interrupted"); } }); t1.start(); Thread t2 = new Thread(() -> { t1.interrupt(); }); t2.start();
Apabila thread melempar InterruptedException, kita perlu mengendalikannya mengikut situasi tertentu. Biasanya, kita harus memanggil Thread.currentThread().interrupt() dalam blok tangkapan untuk mengganggu semula benang supaya pemanggil atas tahu bahawa benang telah terganggu.
Sebagai contoh, dalam kod berikut, selepas benang t1 selesai dilaksanakan, ia akan menyemak sama ada ia telah diganggu dan mengganggu semula dirinya dalam blok tangkapan.
Thread t1 = new Thread(() -> { try { Thread.sleep(5000); System.out.println("Thread finished"); } catch (InterruptedException e) { Thread.currentThread().interrupt(); System.out.println("Thread interrupted"); } }); t1.start(); Thread t2 = new Thread(() -> { t1.interrupt(); }); t2.start();
Selain itu, jika utas melakukan beberapa operasi yang memerlukan pembersihan sumber, seperti melepaskan kunci atau menutup fail, kami juga harus melakukan operasi pembersihan dalam blok tangkapan. Sebagai contoh, dalam kod berikut, selepas thread t1 menyelesaikan pelaksanaan, ia akan mengeluarkan sumber dan menyemak sama ada ia telah diganggu.
Thread t1 = new Thread(() -> { Lock lock = new ReentrantLock(); lock.lock(); try { Thread.sleep(5000); System.out.println("Thread finished"); } catch (InterruptedException e) { Thread.currentThread().interrupt(); System.out.println("Thread interrupted"); } finally { lock.unlock(); } }); t1.start(); Thread t2 = new Thread(() -> { t1.interrupt(); }); t2.start();
Ringkasnya, mentakrifkan kaedah pengendalian pengecualian InterruptedException adalah sangat kritikal Ia boleh membantu kami mengendalikan operasi gangguan benang dengan betul dan mengurangkan kerumitan kod sebanyak mungkin.
Atas ialah kandungan terperinci InterruptedException dalam Java - penyelesaian kepada pengecualian gangguan benang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!