"Hai, Amigo!

"Semua yang baru hanyalah sesuatu yang lama yang telah kita lupakan. Hari ini saya akan berbicara tentang menghentikan utas. Saya harap Anda sudah lupa cara kerja metode interrupt()."

"Ya, Ellie, aku benar-benar lupa."

"Bagus. Kalau begitu aku akan mengingatkanmu."

"Di Java, jika seseorang ingin menghentikan utas yang sedang berjalan, dia bisa memberi sinyal ini ke utas. Untuk melakukan ini, Anda perlu menyetel variabel isInterrupted tersembunyi dari objek Thread ke true."

"Setiap Thread memiliki metode interrupt(), yang digunakan untuk menyetel flag ini. Saat metode interrupt () dipanggil, variabel isInterrupted di dalam objek Thread disetel ke true."

"Dan ketika metode Thread.sleep() atau join() dipanggil pada sebuah thread, metode ini akan memeriksa apakah flag isInterrupted disetel untuk thread saat ini. Jika flag ini disetel (variabel isInterrupted sama dengan true), maka metode melempar InterruptedException ."

"Di sini, saya akan mengingatkan Anda tentang contoh lama:"

Kode Keterangan
class Clock implements Runnable
{
public void run()
{
Thread current = Thread.currentThread();

while (!current.isInterrupted())
{
Thread.sleep(1000);
System.out.println("Tik");
}
}
}
Metode run Jam mendapatkan objek Utas untuk utas saat ini.

Kelas Jam menulis kata "Tick" ke konsol sekali per detik selama variabel isInterrupt utas 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 menyelesaikan pekerjaannya.

"Di sini kita menggunakan metode sleep sebagai bagian dari infinite loop dalam metode run . Di dalam loop, variabel isInterrupt diperiksa secara otomatis. Jika sebuah thread memanggil metode sleep , metode tersebut terlebih dahulu memeriksa apakah isInterrupt benar untuk thread tersebut (the salah satu yang disebut metode tidur). Jika benar, maka metode tersebut tidak akan tidur. Sebaliknya, ia melempar InterruptedException . "

"Namun dalam contoh ini, kami terus-menerus memeriksa variabel isInterrupted dalam kondisi perulangan."

"Saya ingat ada beberapa alasan mengapa kami tidak bisa menggunakan pendekatan ini. Bisakah Anda mengingatkan saya?"

" Pertama , metode run tidak selalu memiliki loop. Metode ini mungkin hanya terdiri dari beberapa lusin panggilan ke metode lain. Dalam hal ini, Anda harus menambahkan tanda centang isInterrupted sebelum setiap pemanggilan metode."

" Kedua , beberapa metode yang melibatkan banyak tindakan berbeda mungkin membutuhkan 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, tetapi itu dia.  Ini sangat berharga ketika Anda sedang menggunakan kode orang lain dan Anda tidak dapat menambahkan cek 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."

"Itulah yang kamu katakan sebelumnya."

"Dan bagaimana dengan pernyataan Anda, « Tidak ada yang bisa menjamin bahwa sebuah utas akan dihentikan. Hanya utas yang dapat berhenti sendiri. » Bisakah Anda menjelaskannya?"

"Tentu."

"Sebelumnya, di versi awal Java, utas memiliki metode stop(). Dan ketika Anda memanggilnya, JVM benar-benar menghentikan utas. Tetapi jika utas melakukan sesuatu di luar JVM (misalnya, menulis ke file atau memanggil fungsi OS) ketika terganggu dengan cara ini, gangguan tersebut menyebabkan banyak masalah, seperti file yang tidak ditutup, sumber daya sistem yang tidak dirilis, dll."

"Rapat umum pencipta Java memutuskan untuk menghapus metode penghentian paksa utas. Sekarang yang bisa kita lakukan hanyalah menetapkan bendera tertentu (isInterrupted) dan berharap kode utas ditulis dengan benar, sehingga bendera ini akan diproses. Bendera ini seperti tanda yang mengatakan, 'Benang, berhenti, tolong. Ini sangat penting!'. Tapi berhenti atau tidak itu urusannya sendiri."

"Tapi bagaimana dengan InterruptedException?"

"Bagaimana jika kode yang berjalan di utas ini memiliki banyak blok coba-tangkap? Bahkan jika InterruptedException terjadi di suatu tempat, pasti tidak ada jaminan bahwa beberapa coba-tangkap tidak akan menangkapnya dan melupakannya. Jadi tidak ada jaminan untuk benang akan berhenti."

"Hal lain adalah bahwa utas sudah dianggap pemrograman tingkat rendah. Tapi saya akan memberi tahu Anda tentang itu lain kali."

"Kamu bukan Ellie—kamu Scheherazade!"

"Jadi, Amigo! Apakah semua pelajaran saat ini sudah jelas?"

"Ya."

"Oke bagus."