"Halo, Amigo! Anda harus mengakui bahwa ide Pembatalan Ellie sangat brilian."
"Ya."
"Sebenarnya, sesuatu yang serupa ada di kelas Thread . Hanya variabelnya yang tidak disebut isCancel . Ini disebut isInterrupt . Dan metode yang digunakan untuk menghentikan utas bukanlah cancel() . Itu interrupt() ."
"Benar-benar?"
"Ya. Coba lihat:"
Kode | Keterangan |
---|---|
|
Karena beberapa thread dapat memanggil metode run pada objek Clock yang sama, kita mendapatkan objek Thread untuk thread saat ini .
Kelas Jam menulis kata "Tick" ke konsol satu detik sekali selama variabel isInterrupt thread saat ini salah. Ketika isInterrupt menjadi true , metode run berakhir. |
|
Utas utama memulai utas anak (jam) yang harus berjalan selamanya.
Tunggu 10 detik dan batalkan tugas dengan memanggil metode interupsi . Utas utama menyelesaikan pekerjaannya. Utas jam mengakhiri pekerjaannya. |
Selain itu, metode sleep , yang sangat disukai orang dalam loop tak berujung dalam metode run , secara otomatis memeriksa variabel isInterrupt . Jika utas memanggil metode tidur , metode tersebut terlebih dahulu memeriksa apakah isInterrupt benar untuk utas itu. Jika benar, metode tidak akan tidur. Sebaliknya, itu melempar pengecualian InterruptedException .
"Mengapa membuang pengecualian? Bukankah lebih baik meletakkan isInterrupted() daripada isCancel() dalam satu lingkaran?"
" Pertama , metode run tidak selalu memiliki loop. Metode ini mungkin hanya terdiri dari beberapa lusin panggilan ke metode lain. Kemudian Anda harus menambahkan centang isInterrupted sebelum setiap pemanggilan metode."
" Kedua , beberapa metode yang melibatkan banyak tindakan berbeda mungkin memerlukan waktu yang sangat lama untuk dijalankan."
" Ketiga , melempar pengecualian tidak menggantikan pemeriksaan isInterrupted. Itu hanya tambahan yang nyaman. Pengecualian yang dilemparkan memungkinkan Anda untuk dengan cepat melepas tumpukan panggilan kembali ke metode jalankan itu sendiri."
" Keempat , metode tidur banyak digunakan. Ternyata, metode yang bermanfaat ini ditingkatkan dengan pemeriksaan implisit yang tidak kalah membantu. Seolah-olah tidak ada yang secara khusus menambahkan cek tersebut, tetapi itu dia. Ini sangat berharga ketika Anda menggunakan kode orang lain dan Anda tidak dapat menambahkan cek itu sendiri."
" Kelima , pemeriksaan tambahan tidak menurunkan kinerja. Memanggil metode tidur berarti utas tidak boleh melakukan apa pun (kecuali tidur), sehingga pekerjaan ekstra tidak mengganggu siapa pun."
"Itu argumen yang serius."
"Dan, akhirnya , ada ini: Metode run Anda dapat memanggil kode orang lain—kode yang tidak dapat Anda akses (kode sumber dan/atau hak untuk mengubah kode). Metode ini mungkin tidak memiliki pemeriksaan isInterrupted, dan mungkin menggunakan " coba ... tangkap (Pengecualian e) " untuk menangkap semua pengecualian."
Tidak ada yang bisa menjamin bahwa sebuah utas akan dihentikan. Hanya utas yang bisa berhenti sendiri.
GO TO FULL VERSION