CodeGym /Kursus Java /Java Multithreading /Semua nuansa mengganggu / menghentikan benang

Semua nuansa mengganggu / menghentikan benang

Java Multithreading
Tahap , pelajaran
Tersedia

"Hai, Amigo!

"Semua yang baharu hanyalah sesuatu yang lama yang telah kita lupakan. Hari ini saya akan bercakap tentang menghentikan benang. Saya harap anda sudah terlupa cara kaedah interrupt() berfungsi."

"Ya, Ellie, saya benar-benar melupakannya."

"Bagus. Lepas tu saya ingatkan awak."

"Di Jawa, jika seseorang ingin menghentikan thread yang sedang berjalan, dia boleh memberi isyarat ini kepada thread. Untuk melakukan ini, anda perlu menetapkan pembolehubah isInterrupted tersembunyi objek Thread kepada benar."

"Setiap Thread mempunyai kaedah interrupt(), yang digunakan untuk menetapkan bendera ini. Apabila kaedah interrupt () dipanggil, pembolehubah isInterrupted di dalam objek Thread ditetapkan kepada benar."

"Dan apabila kaedah Thread.sleep() atau join() dipanggil pada benang, kaedah itu menyemak sama ada bendera isInterrupted ditetapkan untuk thread semasa. Jika bendera ini ditetapkan (pembolehubah isInterrupted sama dengan benar), maka kaedah buang InterruptedException ."

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

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

while (!current.isInterrupted())
{
Thread.sleep(1000);
System.out.println("Tik");
}
}
}
Kaedah larian Jam 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 benar, 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 menamatkan kerjanya.

Benang jam menyelesaikan kerjanya.

"Di sini kita menggunakan kaedah tidur sebagai sebahagian daripada gelung tak terhingga dalam kaedah larian . Dalam gelung, pembolehubah isInterrupt disemak secara automatik. Jika benang memanggil kaedah tidur , kaedah terlebih dahulu menyemak sama ada isInterrupt adalah benar untuk utas itu (the satu yang dipanggil kaedah tidur). Jika ia benar, maka kaedah itu tidak akan tidur. Sebaliknya, ia melemparkan InterruptedException . "

"Tetapi dalam contoh ini, kami sentiasa menyemak pembolehubah isInterrupted dalam keadaan gelung."

"Saya ingat ada beberapa sebab mengapa kita tidak boleh menggunakan pendekatan ini. Boleh awak ingatkan saya?"

" Pertama , kaedah jalankan tidak selalu mempunyai gelung. Kaedah ini mungkin hanya terdiri daripada beberapa dozen panggilan ke kaedah lain. Dalam kes ini, 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 secara khusus menambah cek itu, tetapi ada.  Ini sangat berharga apabila anda sedang 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 betul-betul apa yang awak cakap sebelum ini."

"Dan bagaimana pula dengan kenyataan anda, « Tiada siapa yang boleh menjamin bahawa benang akan dihentikan. Hanya benang boleh berhenti sendiri. » Bolehkah anda menjelaskannya?"

"Tentu."

"Sebelum ini, dalam versi awal Java, thread mempunyai kaedah stop(). Dan apabila anda memanggilnya, JVM sebenarnya menghentikan thread. Tetapi jika thread melakukan sesuatu di luar JVM (contohnya, menulis ke fail atau memanggil Fungsi OS) apabila ia diganggu dengan cara ini, gangguan itu menyebabkan banyak masalah, seperti fail yang tidak ditutup, sumber sistem yang tidak dikeluarkan, dsb.

"Satu mesyuarat agung pencipta Java memutuskan untuk mengalih keluar kaedah untuk menghentikan benang secara paksa. Sekarang apa yang boleh kita lakukan ialah menetapkan bendera tertentu (terganggu) dan berharap kod benang itu ditulis dengan betul, supaya bendera ini akan diproses. Bendera ini adalah seperti tanda yang mengatakan, 'Benang, hentikan, tolong. Ia sangat penting!'. Tetapi sama ada ia berhenti atau tidak adalah urusannya sendiri."

"Tetapi bagaimana dengan InterruptedException?"

"Bagaimana jika kod yang berjalan pada benang ini mempunyai banyak blok cuba-tangkap? Walaupun InterruptedException berlaku di suatu tempat, pastinya tiada jaminan bahawa sesetengah cuba-tangkap tidak akan menangkapnya dan melupakannya. Jadi tidak ada jaminan bahawa benang akan berhenti."

"Perkara lain ialah bahawa benang sudah dianggap pengaturcaraan tahap rendah. Tetapi saya akan memberitahu anda tentang perkara itu lain kali."

"Anda bukan Ellie-anda Scheherazade!"

"Jadi, Amigo! Adakah segala-galanya dalam pelajaran semasa jelas?"

"Ya."

"Okay bagus."

Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION