Mekanisme interupsi Thread adalah cara yang disukai untuk mendapatkan thread (yang bekerja sama) untuk merespons permintaan untuk menghentikan apa yang dilakukannya. Setiap utas (termasuk utas itu sendiri menurut saya) dapat memanggil utas interrupt()
.
Dalam praktiknya, kasus penggunaan normal untuk interrupt()
melibatkan beberapa jenis kerangka kerja atau manajer yang memberi tahu beberapa utas pekerja untuk menghentikan apa yang mereka lakukan. Jika thread pekerja adalah "interrupt aware", ia akan melihat bahwa ia telah diinterupsi melalui sebuah pengecualian, atau dengan secara berkala memeriksa flag interupsinya. Saat memperhatikan bahwa utas telah terputus, utas yang berperilaku baik akan meninggalkan apa yang dilakukannya dan berakhir dengan sendirinya.
Dengan asumsi kasus penggunaan di atas, kode Anda kemungkinan besar akan terganggu jika dijalankan dalam framework Java atau dari beberapa thread pekerja. Dan ketika terputus, kode Anda harus meninggalkan apa yang dilakukannya dan menyebabkan dirinya sendiri diakhiri dengan cara yang paling tepat. Bergantung pada bagaimana kode Anda dipanggil, ini mungkin dilakukan dengan mengembalikan atau dengan memberikan beberapa pengecualian yang sesuai. Tapi mungkin seharusnya tidak menelepon System.exit()
. (Aplikasi Anda tidak selalu tahu mengapa itu diinterupsi, dan pasti tidak tahu apakah ada utas lain yang perlu diinterupsi oleh kerangka kerja.)
Di sisi lain, jika kode Anda tidak dirancang untuk berjalan di bawah kendali beberapa kerangka kerja, Anda dapat membantah bahwa InterruptedException
ini adalah pengecualian yang tidak terduga; yaitu bug. Dalam hal ini, Anda harus memperlakukan pengecualian seperti halnya bug lainnya; misalnya membungkusnya dalam pengecualian yang tidak dicentang, dan menangkap serta mencatatnya pada titik yang sama saat Anda menangani pengecualian tidak dicentang yang tidak terduga lainnya. (Alternatifnya, aplikasi Anda dapat mengabaikan interupsi dan terus melakukan apa yang dilakukannya.)
1) Jika saya sendiri tidak pernah menyela utas lain, apa yang dapat memicu InterruptedException?
Salah satu contohnya adalah jika Runnable
objek Anda dieksekusi menggunakan ExecutorService
dan shutdownNow()
dipanggil pada layanan. Dan dalam teori, kumpulan utas pihak ketiga atau kerangka kerja manajemen utas dapat melakukan hal seperti ini secara sah.
2) Jika saya sendiri tidak pernah menyela utas lain menggunakan interrupt () ... lalu apa InterruptedException
artinya? Apa yang harus saya lakukan setelah menangkapnya? Matikan aplikasi saya?
Anda perlu menganalisis basis kode untuk mencari tahu apa yang membuat interrupt()
panggilan dan mengapa. Setelah Anda mengetahuinya, Anda dapat menentukan >> bagian << aplikasi yang perlu Anda lakukan.
Sampai Anda tahu mengapa InterruptedException
dibuang, saya sarankan untuk memperlakukannya sebagai kesalahan yang sulit; misalnya mencetak stacktrace ke file log dan menutup aplikasi. (Jelas, itu tidak selalu merupakan jawaban yang benar ... tetapi intinya adalah bahwa ini adalah "bug", dan perlu diperhatikan oleh pengembang / pengelola.)
3) Bagaimana cara mengetahui siapa / apa yang menelepon interrupt()
?
Tidak ada jawaban yang bagus untuk ini. Yang terbaik yang bisa saya sarankan adalah mengatur breakpoint pada Thread.interrupt()
dan melihat tumpukan panggilan.