1. Gambaran keseluruhan
Dalam artikel pendek ini, kita akan melihat benang daemon di Java dan melihat apa yang boleh digunakan. Kami juga akan menerangkan perbezaan antara benang daemon dan utas pengguna.
2. Perbezaan Antara Benang Daemon dan Pengguna
Java menawarkan dua jenis utas: utas pengguna dan benang daemon.
Benang pengguna adalah utas keutamaan tinggi. JVM akan menunggu sebarang utas pengguna menyelesaikan tugasnya sebelum menghentikannya.
Sebaliknya, benang daemon adalah utas keutamaan rendah yang satu-satunya peranannya adalah memberikan perkhidmatan kepada utas pengguna.
Oleh kerana benang daemon dimaksudkan untuk melayani utas pengguna dan hanya diperlukan semasa utas pengguna berjalan, mereka tidak akan menghalang JVM keluar setelah semua utas pengguna selesai dijalankan.
Itulah sebabnya gelung tak terhingga, yang biasanya terdapat dalam benang daemon, tidak akan menimbulkan masalah, kerana mana-mana kod, termasuk blok akhirnya , tidak akan dilaksanakan setelah semua utas pengguna selesai dijalankan. Atas sebab ini, benang daemon tidak digalakkan untuk tugas I / O.
Walau bagaimanapun, terdapat pengecualian untuk peraturan ini. Kod yang direka dengan buruk dalam benang daemon dapat mengelakkan JVM keluar. Sebagai contoh, memanggil Thread.join () pada benang daemon yang berjalan dapat menyekat penutupan aplikasi.
3. Kegunaan Benang Daemon
Benang Daemon berguna untuk tugas menyokong latar belakang seperti pengumpulan sampah, melepaskan memori objek yang tidak digunakan dan mengeluarkan entri yang tidak diingini dari cache. Sebilangan besar utas JVM adalah utas daemon.
4. Membuat Benang Daemon
Untuk menetapkan utas menjadi utas daemon, yang perlu kita lakukan hanyalah memanggil Thread.setDaemon (). Dalam contoh ini, kami akan menggunakan kelas NewThread yang meluaskan kelas Thread :
NewThread daemonThread = new NewThread(); daemonThread.setDaemon(true); daemonThread.start();
Sebarang benang mewarisi status daemon benang yang membuatnya. Oleh kerana utas utamanya adalah utas pengguna, sebarang utas yang dibuat di dalam kaedah utama secara default adalah utas pengguna.
Kaedah setDaemon () hanya dapat dipanggil setelah objek Thread dibuat dan utas belum dimulakan. Percubaan untuk memanggil setDaemon () semasa utas berjalan akan membuang IllegalThreadStateException :
@Test(expected = IllegalThreadStateException.class) public void whenSetDaemonWhileRunning_thenIllegalThreadStateException() { NewThread daemonThread = new NewThread(); daemonThread.start(); daemonThread.setDaemon(true); }
5. Memeriksa apakah Benang Adalah Benang Daemon
Akhirnya, untuk memeriksa sama ada benang adalah benang daemon, kita hanya boleh memanggil kaedahnyaDaemon () :
@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. Kesimpulannya
Dalam tutorial ringkas ini, kita telah melihat apa itu benang daemon dan apa yang boleh digunakan dalam beberapa senario praktikal.
Seperti biasa, versi penuh kod boleh didapati di GitHub.