Rumah > Java > javaTutorial > teks badan

InterruptedException dalam Java - penyelesaian kepada pengecualian gangguan benang

王林
Lepaskan: 2023-06-25 11:15:07
asal
2328 orang telah melayarinya

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.

  1. Punca 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();
Salin selepas log masuk
  1. Penyelesaian kepada InterruptedException

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();
Salin selepas log masuk

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();
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan