metode interupsi
Interupsi secara harfiah berarti interupsi, tetapi di Java metode Thread.interrupt() sebenarnya memberi tahu thread dalam beberapa cara dan tidak secara langsung menghentikan thread. Terserah pada orang yang menulis kode untuk memutuskan apa yang harus dilakukan, dan biasanya kami membatalkan thread tersebut.
Jika thread memanggil metode wait(), wait(long) atau wait(long, int) dari kelas Object, atau join(), join(long), join(long, int), sleep(long) atau tidur kelas (panjang, int) diblokir selama metode ini, status interupsinya akan dihapus, dan juga akan menerima InterruptedException.
Jika thread diblokir dalam operasi I/O pada saluran yang dapat diinterupsi (java.nio.channels.InterruptibleChannel), saluran akan ditutup, status interupsi thread akan ditetapkan dan thread akan menerima ClosedByInterruptException.
Jika thread diblokir di Selector (java.nio.channels.Selector), status interupsi thread akan disetel dan akan segera kembali dari operasi pemilihan, mungkin dengan nilai bukan nol, seolah-olah pilih disebut Bangun metode perangkatnya sama.
Jika tidak ada kondisi sebelumnya yang disimpan, status interupsi thread akan ditetapkan.
Mengganggu thread yang tidak aktif tidak berpengaruh.
mendeteksi interupsi
Cara interupsi terdeteksi bergantung pada apa yang dilakukan thread.
Jika thread memanggil metode yang dapat memunculkan InterruptException, tangkap InterruptException lalu tangani di blok catch (biasanya keluar dari metode run untuk menginterupsi thread)
Jika Anda memanggil metode lain, Anda dapat memeriksa Thread.interrupted saat idle untuk menentukan apakah sinyal interupsi diterima, dan memprosesnya setelah mengonfirmasi bahwa sinyal interupsi diterima. InterruptException dapat dilempar agar konsisten dengan metode penanganan sebelumnya
status interupsi
Mekanisme interupsi thread diimplementasikan menggunakan flag internal status interupsi. Status interupsi diatur ketika metode interupsi() thread dipanggil (lihat deskripsi metode interupsi di atas).
Ada dua cara untuk mendapatkan status interupsi suatu thread:
Panggil metode statis Thread.interrupted(). Selain mengembalikan status interupsi thread saat ini, metode ini juga menghapus status interupsi thread saat ini. Dengan kata lain, jika metode ini dipanggil dua kali berturut-turut, panggilan kedua akan menghasilkan false (setelah panggilan pertama menghapus status interupsinya, dan sebelum panggilan kedua memverifikasi status interupsi, thread saat ini diinterupsi lagi. pengecualian ).
Panggil metode isInterrupted() dari thread yang ditentukan. Metode ini hanya mengembalikan status interupsi dari thread yang ditentukan tanpa memengaruhi status interupsi thread.
Ada dua cara untuk menghapus status interupsi thread:
Seperti disebutkan di atas, memanggil Thread.interrupted()
Ketika metode interupsi() dari thread dipanggil untuk menyebabkan InterruptedException, status interupsi dari thread tersebut telah dihapus pada saat yang sama, termasuk metode wait(), wait(long) atau wait(long, int) dari Object kelas, atau metode join() , join(long) , join(long, int) , sleep(long) atau sleep(long, int) thread