Daemon Threads di Java

1. Ikhtisar

Dalam artikel singkat ini, kita akan melihat utas daemon di Java dan melihat apa kegunaannya. Kami juga akan menjelaskan perbedaan antara utas daemon dan utas pengguna.

2. Perbedaan Antara Daemon dan User Threads

Java menawarkan dua jenis utas: utas pengguna dan utas daemon.

Utas pengguna adalah utas prioritas tinggi. JVM akan menunggu utas pengguna menyelesaikan tugasnya sebelum menghentikannya.

Di sisi lain, utas daemon adalah utas prioritas rendah yang perannya hanya menyediakan layanan ke utas pengguna.

Karena utas daemon dimaksudkan untuk melayani utas pengguna dan hanya diperlukan saat utas pengguna berjalan, mereka tidak akan mencegah keluarnya JVM setelah semua utas pengguna menyelesaikan eksekusinya.

Itulah mengapa perulangan tak terbatas, yang biasanya ada di utas daemon, tidak akan menimbulkan masalah, karena kode apa pun, termasuk blok terakhir , tidak akan dijalankan setelah semua utas pengguna menyelesaikan eksekusinya. Karena alasan ini, untaian daemon tidak direkomendasikan untuk tugas I / O.

Namun, ada pengecualian untuk aturan ini. Kode yang dirancang dengan buruk dalam utas daemon dapat mencegah keluarnya JVM. Misalnya, memanggil Thread.join () pada utas daemon yang sedang berjalan dapat memblokir pematian aplikasi.

3. Kegunaan Daemon Threads

Untaian daemon berguna untuk tugas-tugas pendukung latar belakang seperti pengumpulan sampah, melepaskan memori dari objek yang tidak digunakan dan menghapus entri yang tidak diinginkan dari cache. Sebagian besar utas JVM adalah utas daemon.

4. Membuat Thread Daemon

Untuk menyetel utas menjadi utas daemon, yang perlu kita lakukan hanyalah memanggil Thread.setDaemon (). Dalam contoh ini, kita akan menggunakan kelas NewThread yang memperluas kelas Thread :

NewThread daemonThread = new NewThread(); daemonThread.setDaemon(true); daemonThread.start();

Setiap utas mewarisi status daemon dari utas yang membuatnya. Karena utas utama adalah utas pengguna, utas apa pun yang dibuat di dalam metode utama secara default adalah utas pengguna.

Metode setDaemon () hanya bisa dipanggil setelah objek Thread dibuat dan thread belum dimulai. Upaya untuk memanggil setDaemon () saat thread sedang berjalan akan memunculkan IllegalThreadStateException :

@Test(expected = IllegalThreadStateException.class) public void whenSetDaemonWhileRunning_thenIllegalThreadStateException() { NewThread daemonThread = new NewThread(); daemonThread.start(); daemonThread.setDaemon(true); }

5. Memeriksa apakah sebuah Thread Adalah Thread Daemon

Terakhir, untuk memeriksa apakah sebuah utas adalah utas daemon, kita cukup memanggil metode isDaemon () :

@Test public void whenCallIsDaemon_thenCorrect() { NewThread daemonThread = new NewThread(); NewThread userThread = new NewThread(); daemonThread.setDaemon(true); daemonThread.start(); userThread.start(); assertTrue(daemonThread.isDaemon()); assertFalse(userThread.isDaemon()); }

6. Kesimpulan

Dalam tutorial singkat ini, kita telah melihat apa itu daemon thread dan apa kegunaannya dalam beberapa skenario praktis.

Seperti biasa, versi lengkap kode tersedia di GitHub.