Mengapa memanggil metode Thread.currentThread.interrupt()
di blok tangkap?
sumber
Mengapa memanggil metode Thread.currentThread.interrupt()
di blok tangkap?
Ini dilakukan untuk menjaga status .
Ketika Anda menangkap InterruptException
dan menelannya, pada dasarnya Anda mencegah metode / grup utas tingkat tinggi dari memperhatikan interupsi. Yang bisa menyebabkan masalah.
Dengan menelepon Thread.currentThread().interrupt()
, Anda mengatur bendera interupsi utas, sehingga penangan interupsi tingkat yang lebih tinggi akan melihatnya dan dapat menanganinya dengan tepat.
Java Concurrency in Practice membahas ini secara lebih rinci di Bab 7.1.3: Menanggapi Gangguan . Aturannya adalah:
Hanya kode yang menerapkan kebijakan interupsi utas yang dapat menelan permintaan interupsi. Tugas dan kode pustaka untuk tujuan umum tidak boleh menelan permintaan interupsi.
InterruptedException
status interupsi yang jelas ketika melakukannya. Saya pikir ini membuat jawaban lebih jelas dalam hal mengapa Anda perlu mempertahankan status interupsi.interrupt()
panggilan adalah satu-satunya cara untuk mengatur bendera yang terputus begitu Anda menerima pemberitahuan tentang keadaan ini melalui "mekanisme pengiriman" lainnya -InterruptedException
dan ingin atau tidak dapat melemparkan kembali.Saya pikir contoh kode ini membuat semuanya lebih jelas. Kelas yang melakukan pekerjaan:
Kelas Utama:
Coba panggil interupsi tanpa mengembalikan status.
sumber
catatan:
http://download.oracle.com/javase/7/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html
Bagaimana cara menghentikan utas yang menunggu dalam waktu lama (mis., Untuk input)?
Ini memastikan bahwa Thread akan membangkitkan kembali InterruptedException secepatnya.
sumber
Saya akan menganggapnya sebagai praktik yang buruk atau setidaknya sedikit berisiko. Biasanya metode tingkat yang lebih tinggi tidak melakukan operasi pemblokiran dan mereka tidak akan pernah melihat di
InterruptedException
sana. Jika Anda menyembunyikannya di setiap tempat Anda melakukan operasi interupsi, Anda tidak akan pernah mendapatkannya.Satu-satunya alasan untuk
Thread.currentThread.interrupt()
dan tidak meningkatkan pengecualian lain atau menandakan permintaan interupsi dengan cara lain (misalnya mengaturinterrupted
variabel variabel lokal di loop utama utas) adalah situasi di mana Anda benar-benar tidak dapat melakukan apa pun dengan pengecualian, seperti difinally
blok.Lihat jawaban Péter Török, jika Anda ingin lebih memahami implikasi
Thread.currentThread.interrupt()
panggilan tersebut.sumber
Rujuk dari java doc
Jadi, jika Anda mengubah metode sleepBabySleep () di @Ajay George Answer untuk operasi I / O atau hanya sysout, Anda tidak perlu mengatur status kembali untuk menghentikan program. (BTW, mereka bahkan tidak membuang InterruptedException)
Sama seperti @ Péter Török berkata => Ini dilakukan untuk menjaga status. (Dan khusus untuk metode yang akan membuang InterruptedException)
sumber