Bisakah Anda menjelaskan apa yang java.lang.Thread.interrupt()
dilakukan ketika dipanggil?
java
multithreading
oneat
sumber
sumber
Jawaban:
Thread.interrupt()
mengatur status / bendera terputus dari utas target. Kemudian kode yang berjalan di utas target itu MUNGKIN mengumpulkan status terputus dan menanganinya dengan tepat. Beberapa metode yang memblokir sepertiObject.wait()
dapat langsung mengkonsumsi status terputus dan melemparkan pengecualian yang sesuai (biasanyaInterruptedException
)Gangguan di Jawa tidak bersifat pre-emptive. Dengan kata lain kedua utas harus bekerja sama untuk memproses interupsi dengan benar. Jika utas target tidak menyurvei status terputus, interupsi secara efektif diabaikan.
Polling terjadi melalui
Thread.interrupted()
metode yang mengembalikan status terputus utas saat ini DAN menghapus tanda tersebut. Biasanya utas kemudian dapat melakukan sesuatu seperti melempar InterruptedException.EDIT (dari komentar Thilo): Beberapa metode API telah dibangun dalam penanganan interupsi. Dari atas kepala saya ini termasuk.
Object.wait()
,,Thread.sleep()
danThread.join()
java.util.concurrent
strukturInterruptedException
, alih-alih menggunakanClosedByInterruptException
.EDIT (dari jawaban @ thomas-pornin untuk pertanyaan yang sama persis untuk kelengkapan)
Interupsi utas adalah cara yang lembut untuk mendorong utas. Ini digunakan untuk memberi kesempatan pada thread untuk keluar dengan bersih , sebagai lawan dari
Thread.stop()
itu lebih seperti menembak utas dengan senapan serbu.sumber
Apa itu interupsi?
Bagaimana penerapannya?
Kutipan dari
Thread.interrupt()
API :Lihat ini untuk pemahaman lengkap tentang hal yang sama:
http://download.oracle.com/javase/tutorial/essential/concurrency/interrupt.html
sumber
Jika utas yang ditargetkan telah menunggu (dengan menelepon
wait()
, atau beberapa metode terkait lainnya yang pada dasarnya melakukan hal yang sama, sepertisleep()
), itu akan terputus, artinya berhenti menunggu apa yang ditunggu dan menerima InterruptedException sebagai gantinya.Ini sepenuhnya tergantung pada utas itu sendiri (kode yang memanggil
wait()
) untuk memutuskan apa yang harus dilakukan dalam situasi ini. Itu tidak secara otomatis menghentikan utas.Kadang-kadang digunakan dalam kombinasi dengan bendera penghentian. Ketika terputus, utas dapat memeriksa bendera ini, lalu menutupnya sendiri. Tetapi sekali lagi, ini hanya sebuah konvensi.
sumber
Untuk kelengkapan, di samping jawaban lain, jika utas terputus sebelum ia memblokir
Object.wait(..)
atauThread.sleep(..)
lain - lain, ini setara dengan itu terputus segera setelah memblokir pada metode itu , seperti yang ditunjukkan contoh berikut.Keluaran:
Implikasi: jika Anda mengulangi seperti berikut, dan interupsi terjadi pada saat yang tepat ketika kontrol telah pergi
Thread.sleep(..)
dan berkeliling loop, pengecualian masih akan terjadi. Jadi, sangat aman untuk mengandalkan InterruptedException yang andal dilemparkan setelah utas terputus :sumber
Thread.interrupt()
mengatur status / bendera terputus dari utas target menjadi true yang bila diperiksa menggunakanThread.interrupted()
dapat membantu menghentikan utas tak berujung. Rujuk http://www.yegor256.com/2015/10/10/interrupted-exception.htmlsumber
Interupsi utas didasarkan pada status interupsi bendera . Untuk setiap utas nilai default dari status interupsi disetel ke false . Kapanpun metode interupsi () dipanggil pada utas, status interupsi disetel ke true .
sumber
public void interrupt ()
Mengganggu utas ini.
Kecuali jika utas saat ini mengganggu dirinya sendiri, yang selalu diizinkan, metode checkAccess dari utas ini dipanggil, yang dapat menyebabkan SecurityException dilempar.
Jika utas ini diblokir dalam permohonan metode wait (), wait (long), atau wait (long, int) dari kelas Object, atau dari join (), join (long), join (long, int) , sleep (long), atau sleep (long, int), metode kelas ini, maka status interruptnya akan dihapus dan ia akan menerima InterruptedException.
Jika utas ini diblokir dalam operasi I / O pada saluran interruptible maka saluran akan ditutup, status interupsi utas akan ditetapkan, dan utas akan menerima ClosedByInterruptException.
Jika utas ini diblokir dalam Pemilih maka status interupsi utas akan ditetapkan dan akan segera kembali dari operasi pemilihan, mungkin dengan nilai bukan nol, sama seperti jika metode bangun pemilih dipanggil.
Jika tidak ada kondisi sebelumnya yang bertahan maka status interupsi utas ini akan ditetapkan.
Mengganggu utas yang tidak hidup tidak perlu memiliki efek apa pun.
Melempar: SecurityException - jika utas saat ini tidak dapat mengubah utas ini
sumber
Interupsi adalah indikasi untuk utas bahwa ia harus menghentikan apa yang dilakukannya dan melakukan sesuatu yang lain. Terserah programmer untuk memutuskan dengan tepat bagaimana sebuah thread merespon interupsi, tetapi sangat umum bagi thread untuk mengakhiri. Referensi yang sangat bagus: https://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html
sumber
Metode Thread.interrupt () menetapkan flag 'interrupt status' internal. Biasanya flag itu dicentang dengan metode Thread.interrupted ().
Dengan konvensi, metode apa pun yang ada melalui InterruptedException harus menghapus tanda status interupsi.
sumber