"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
class Clock implements Runnable
{
public void run()
{
Thread current = Thread.currentThread();

while (!current.isInterrupted())
{
Thread.sleep(1000);
System.out.println("Tick");
}
}
}
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.

public static void main(String[] args)
{
Clock clock = new Clock();
Thread clockThread = new Thread(clock);
clockThread.start();

Thread.sleep(10000);
clockThread.interrupt();
}
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.