Cara Membunuh Thread Java

1. Perkenalan

Dalam artikel singkat ini, kita akan membahas penghentian Thread di Java - yang tidak sesederhana itu karena metode Thread.stop () sudah tidak digunakan lagi.

Seperti yang dijelaskan dalam pembaruan ini dari Oracle, stop () dapat menyebabkan rusaknya objek yang dipantau.

2. Menggunakan Bendera

Mari kita mulai dengan kelas yang membuat dan memulai utas. Tugas ini tidak akan berakhir dengan sendirinya, jadi kita perlu beberapa cara untuk menghentikan utas itu.

Kami akan menggunakan bendera atom untuk itu:

public class ControlSubThread implements Runnable { private Thread worker; private final AtomicBoolean running = new AtomicBoolean(false); private int interval; public ControlSubThread(int sleepInterval) { interval = sleepInterval; } public void start() { worker = new Thread(this); worker.start(); } public void stop() { running.set(false); } public void run() { running.set(true); while (running.get()) { try { Thread.sleep(interval); } catch (InterruptedException e){ Thread.currentThread().interrupt(); System.out.println( "Thread was interrupted, Failed to complete operation"); } // do something here } } }

Daripada memiliki while loop mengevaluasi sebuah konstanta true , kita menggunakan AtomicBoolean dan sekarang kita bisa memulai / menghentikan eksekusi dengan menyetelnya ke true / false.

Seperti yang dijelaskan dalam pengantar kami ke Variabel Atom, menggunakan AtomicBoolean mencegah konflik dalam pengaturan dan memeriksa variabel dari utas yang berbeda.

3. Menyela Thread

Apa yang terjadi jika sleep () disetel ke interval yang lama, atau jika kami menunggu kunci yang mungkin tidak akan pernah dibuka?

Kami menghadapi risiko pemblokiran untuk waktu yang lama atau tidak pernah mengakhiri dengan bersih.

Kita bisa membuat interrupt () untuk situasi ini, mari tambahkan beberapa metode dan flag baru ke kelas:

public class ControlSubThread implements Runnable { private Thread worker; private AtomicBoolean running = new AtomicBoolean(false); private int interval; // ... public void interrupt() { running.set(false); worker.interrupt(); } boolean isRunning() { return running.get(); } boolean isStopped() { return stopped.get(); } public void run() { running.set(true); stopped.set(false); while (running.get()) { try { Thread.sleep(interval); } catch (InterruptedException e){ Thread.currentThread().interrupt(); System.out.println( "Thread was interrupted, Failed to complete operation"); } // do something } stopped.set(true); } } 

Kami telah menambahkan metode interrupt () yang menyetel flag berjalan kami ke false dan memanggil metode interrupt () thread pekerja .

Jika utas sedang tidur saat ini dipanggil, sleep () akan keluar dengan InterruptedException, seperti halnya panggilan pemblokiran lainnya.

Ini mengembalikan utas ke loop, dan itu akan keluar karena running salah.

4. Kesimpulan

Dalam tutorial singkat ini, kita melihat bagaimana menggunakan variabel atom, secara opsional dikombinasikan dengan panggilan ke interrupt (), untuk menutup thread dengan rapi. Ini jelas lebih baik daripada memanggil metode stop () yang tidak digunakan lagi dan berisiko mengunci selamanya dan kerusakan memori.

Seperti biasa, kode sumber lengkap tersedia di GitHub.