Pilihan default yang benar adalah menambahkan InterruptedException ke daftar lemparan Anda. Interrupt menunjukkan bahwa utas lain ingin utas Anda berakhir. Alasan permintaan ini tidak dibuat jelas dan sepenuhnya kontekstual, jadi jika Anda tidak memiliki pengetahuan tambahan, Anda harus menganggap itu hanya shutdown yang ramah, dan apa pun yang menghindari shutdown adalah respons yang tidak ramah.
Java tidak akan secara acak melempar InterruptedException, semua saran tidak akan memengaruhi aplikasi Anda, tetapi saya telah mengalami kasus di mana pengembang yang mengikuti strategi "menelan" menjadi sangat tidak nyaman. Sebuah tim telah mengembangkan serangkaian besar tes dan menggunakan Thread. Tidur banyak. Sekarang kami mulai menjalankan tes di server CI kami, dan kadang-kadang karena cacat dalam kode akan terjebak dalam menunggu permanen. Untuk membuat situasi lebih buruk, ketika mencoba untuk membatalkan pekerjaan CI itu tidak pernah ditutup karena Thread.Interrupt yang dimaksudkan untuk membatalkan tes tidak membatalkan pekerjaan. Kami harus masuk ke kotak dan mematikan proses secara manual.
Singkatnya, jika Anda hanya membuang InterruptedException Anda cocok dengan maksud default bahwa utas Anda harus diakhiri. Jika Anda tidak dapat menambahkan InterruptedException ke daftar lemparan Anda, saya akan membungkusnya dalam RuntimeException.
Ada argumen yang sangat rasional untuk dibuat bahwa InterruptedException harus menjadi RuntimeException itu sendiri, karena itu akan mendorong penanganan "default" yang lebih baik. Ini bukan RuntimeException hanya karena desainer menempel pada aturan kategoris bahwa RuntimeException harus mewakili kesalahan dalam kode Anda. Karena InterruptedException tidak muncul langsung dari kesalahan dalam kode Anda, itu tidak. Tetapi kenyataannya adalah bahwa sering terjadi InterruptedException muncul karena ada kesalahan dalam kode Anda, (yaitu loop tak berujung, dead-lock), dan Interrupt adalah beberapa metode thread lain untuk menangani kesalahan itu.
Jika Anda tahu ada pembersihan rasional yang harus dilakukan, maka lakukanlah. Jika Anda mengetahui alasan yang lebih dalam untuk Interrupt, Anda dapat mengambil penanganan yang lebih komprehensif.
Jadi secara ringkas pilihan Anda untuk penanganan harus mengikuti daftar ini:
- Secara default, tambahkan ke lemparan.
- Jika tidak diizinkan menambah lemparan, lempar RuntimeException (e). (Pilihan terbaik dari beberapa opsi buruk)
- Hanya ketika Anda mengetahui penyebab eksplisit Interupsi, tangani sesuai keinginan. Jika penanganan Anda sesuai dengan metode Anda, maka setel ulang terganggu oleh panggilan ke Thread.currentThread (). Interrupt ().