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

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

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

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