"Hello, Amigo! Kamu harus mengakui bahawa idea Cancel Ellie adalah bernas."
"Ya."
"Sebenarnya, sesuatu yang serupa wujud dalam kelas Thread . Hanya pembolehubah tidak dipanggil isCancel . Ia dipanggil isInterrupt . Dan kaedah yang digunakan untuk menghentikan thread itu bukan cancel() . Ia interrupt() ."
"Betul ke?"
"Ya. Semak:"
Kod | Penerangan |
---|---|
|
Oleh kerana beberapa utas boleh memanggil kaedah larian pada objek Jam yang sama, kami mendapat objek Thread untuk utas semasa .
Kelas Jam menulis perkataan "Tick" pada konsol sekali sesaat selagi pembolehubah isInterrupt thread semasa adalah palsu. Apabila isInterrupt menjadi true , kaedah run ditamatkan. |
|
Benang utama memulakan benang kanak-kanak (jam) yang sepatutnya berjalan selama-lamanya.
Tunggu 10 saat dan batalkan tugas dengan memanggil kaedah gangguan . Benang utama menyelesaikan kerjanya. Benang jam menamatkan kerjanya. |
Selain itu, kaedah tidur , yang orang sangat gemar menggunakan dalam gelung tanpa henti dalam kaedah larian , secara automatik menyemak pembolehubah isInterrupt . Jika benang memanggil kaedah tidur , kaedah terlebih dahulu menyemak sama ada isInterrupt adalah benar untuk urutan itu. Jika ia benar, kaedah itu tidak akan tidur. Sebaliknya, ia membuang pengecualian InterruptedException .
"Mengapa membuang pengecualian? Bukankah lebih baik untuk meletakkan isInterrupted() dan bukannya isCancel() dalam gelung?"
" Pertama , kaedah larian tidak selalu mempunyai gelung. Kaedah ini mungkin hanya terdiri daripada beberapa dozen panggilan ke kaedah lain. Kemudian anda perlu menambah semakan isInterrupted sebelum setiap panggilan kaedah."
" Kedua , beberapa kaedah yang melibatkan banyak tindakan berbeza mungkin mengambil masa yang sangat lama untuk dilaksanakan."
" Ketiga , melontar pengecualian tidak menggantikan cek isInterrupted. Ia hanyalah tambahan yang mudah. Pengecualian yang dilontar membolehkan anda dengan cepat melepaskan timbunan panggilan kembali kepada kaedah jalankan itu sendiri."
" Keempat , kaedah tidur banyak digunakan. Ternyata kaedah membantu ini dipertingkatkan dengan pemeriksaan tersirat yang tidak kurang membantunya. Seolah-olah tiada siapa yang menambah cek secara khusus, tetapi ada. Ini sangat berharga apabila anda menggunakan kod orang lain dan anda tidak boleh menambah cek itu sendiri."
" Kelima , pemeriksaan tambahan tidak merendahkan prestasi. Memanggil kaedah tidur bermakna bahawa utas itu tidak sepatutnya melakukan apa-apa (kecuali tidur), jadi kerja tambahan tidak mengganggu sesiapa pun."
"Itu adalah hujah yang serius."
"Dan, akhirnya , terdapat ini: Kaedah larian anda boleh memanggil kod orang lain—kod yang anda tidak mempunyai akses kepada (kod sumber dan/atau hak untuk menukar kod). Ia mungkin tidak mempunyai semakan isInterrupted dan ia mungkin menggunakan " cuba ... tangkap (Pengecualian e) " untuk menangkap semua pengecualian."
Tiada siapa yang boleh menjamin bahawa benang akan dihentikan. Hanya seutas benang boleh berhenti sendiri.
GO TO FULL VERSION