Apa itu daemon thread di Jawa?


809

Adakah yang bisa memberi tahu saya apa thread daemon di Jawa ?


20
The Threadjavadoc menggambarkan apa yang mereka: java.sun.com/javase/6/docs/api/java/lang/Thread.html
skaffman


2
Untuk Daemon Threads, ketika JVM berhenti semua thread daemon keluar Karena alasan ini, thread daemon tidak boleh sering digunakan karena pembersihan mungkin tidak dijalankan pada mereka. Misalnya setiap I / O tidak akan keluar dan menulis / membaca dengan anggun sampai akhir.
msj121

Jawaban:


631

Utas daemon adalah utas yang tidak mencegah JVM keluar saat program selesai tetapi utas masih berjalan. Contoh untuk thread daemon adalah pengumpulan sampah.

Anda dapat menggunakan setDaemon(boolean)metode ini untuk mengubah Threadproperti daemon sebelum utas dimulai.


210
Untuk anak cucu, setDamon(boolean)hanya bisa dipanggil sebelum utas dimulai. Secara default utas mewarisi status daemon utas induknya.
Gray

1
"tidak mencegah JVM keluar ketika program selesai tetapi utas masih berjalan" sementara @sateesh mengatakan bahwa "JVM menghentikan semua sisa benang daemon yang ditinggalkan". Jadi, apakah daemon threads selesai berjalan ketika JVM keluar?
Gerald

23
@ Emerald, SEMUA utas terbunuh saat JVM keluar. B_erb berkata, "... ketika program selesai." Apa itu artinya, jika program tidak secara eksplisit membunuh JVM, maka JVM akan secara otomatis bunuh diri ketika utas non -daemon terakhir berakhir. Utas normal menentukan "saat program keluar." Utas daemon tidak.
Solomon Slow

2
Jadi baris ini thread that does not prevent the JVM from exiting when the program finishes but the thread is still runningpada dasarnya berarti proses JVM yang memulai utas tidak peduli apakah daemon utas selesai dijalankan atau tidak, itu hanya akan berakhir sendiri jika semua utas normal telah selesai dieksekusi.
Bhargav

1
@ SolomonSlow Apa konsekuensi dari membunuh sebuah daemon thread (misalnya, seorang pengumpul sampah) ketika masih melakukan tugasnya, ketika JVM berakhir? Terima kasih.
Venkat Ramakrishnan

340

Beberapa poin lagi (Referensi: Java Concurrency in Practice )

  • Ketika utas baru dibuat, ia mewarisi status daemon dari induknya.
  • Ketika semua utas non-daemon selesai, JVM berhenti, dan utas daemon lainnya ditinggalkan :

    • akhirnya blok tidak dieksekusi ,
    • tumpukan tidak terlepas - JVM baru saja keluar.

    Karena alasan ini, daemon thread harus digunakan dengan hemat, dan berbahaya untuk menggunakannya untuk tugas-tugas yang dapat melakukan segala jenis I / O.


3
Mengapa thread daemon tidak digunakan untuk I / O? Apakah ini masalah tentang BufferedWriters dll tidak disiram?
Paul Cager

4
@PaulCager Ya, mereka bisa saja terputus di tengah menulis / baca juga.
Cruncher

52
Poin kedua adalah omong kosong. Ketika JVM berhenti, semua utas mati dan tidak ada finallyblok yang dieksekusi, terlepas dari apakah utas itu daemon atau bukan. Jadi jangan panggil System.exit(…)jika Anda berpikir mungkin ada utas yang menjalankan I / O. Satu-satunya perbedaan adalah bahwa JVM akan memicu penghentian sendiri ketika hanya daemon thread yang tersisa.
Holger

11
Apa yang dimaksud dengan "tumpukan tidak terlepas"?
ɢʜʘʂʈ ʀɛɔʘɴ

2
@ ɢʜʘʂʈʀɛɔʘɴ ada beberapa penjelasan di luar sana tentang "tumpukan yang tidak bisa dibuka
user766353

175

Semua jawaban di atas baik. Berikut cuplikan kode kecil sederhana, untuk menggambarkan perbedaannya. Cobalah dengan masing-masing nilai true dan false in setDaemon.

public class DaemonTest {

    public static void main(String[] args) {
        new WorkerThread().start();

        try {
            Thread.sleep(7500);
        } catch (InterruptedException e) {
            // handle here exception
        }

        System.out.println("Main Thread ending") ;
    }

}

class WorkerThread extends Thread {

    public WorkerThread() {
        // When false, (i.e. when it's a user thread),
        // the Worker thread continues to run.
        // When true, (i.e. when it's a daemon thread),
        // the Worker thread terminates when the main 
        // thread terminates.
        setDaemon(true); 
    }

    public void run() {
        int count = 0;

        while (true) {
            System.out.println("Hello from Worker "+count++);

            try {
                sleep(5000);
            } catch (InterruptedException e) {
                // handle exception here
            }
        }
    }
}

2
@Russ Cuplikan kode yang bagus! Saya harus mendefinisikan kelas WorkerThread sebagai statis.
xli

@ xli Anda bisa melakukan DaemonTest baru (). WorkerThread baru (). mulai () juga :)
abhy

@ Tulis contoh yang bagus. Saya menyadari bahwa yang default adalah "setDeamon (false)" jika Anda tidak secara eksplisit mendefinisikan "setDaemon (true)"
huseyin

96

Secara tradisional proses daemon di UNIX adalah proses yang terus berjalan di latar, seperti halnya layanan di Windows.

Daemon thread di Java adalah salah satu yang tidak mencegah JVM keluar. Secara khusus JVM akan keluar ketika hanya daemon thread yang tersisa. Anda membuatnya dengan memanggil setDaemon()metode Thread.

Baca thread Daemon .


3
tautan Anda sudah mati pada saat ini, mungkin Anda ingin memperbarui? toh, +1 untuk Anda.
Jasonw

2
Saya suka perbandingan antara UNIX dan Windows.
Premraj

Penjelasan terbaik di sini!
LoveMeow

57

Utas daemon seperti penyedia layanan untuk utas atau objek lain yang berjalan dalam proses yang sama dengan utas daemon. Utas daemon digunakan untuk tugas pendukung latar belakang dan hanya diperlukan saat utas normal dijalankan. Jika utas normal tidak berjalan dan utas yang tersisa adalah utas daemon maka juru bahasa keluar.

Misalnya, browser HotJava menggunakan hingga empat untaian daemon bernama "Pengambil Gambar" untuk mengambil gambar dari sistem file atau jaringan untuk utas apa pun yang memerlukannya.

Thread daemon biasanya digunakan untuk melakukan layanan untuk aplikasi / applet Anda (seperti memuat "bit fiddley"). Perbedaan utama antara utas pengguna dan utas daemon adalah bahwa JVM hanya akan mematikan program ketika semua utas pengguna telah dihentikan. Utas daemon diakhiri oleh JVM ketika tidak ada lagi utas pengguna yang berjalan, termasuk utas utama eksekusi.

setDaemon (benar / salah)? Metode ini digunakan untuk menentukan bahwa utas adalah daemon utas.

public boolean isDaemon ()? Metode ini digunakan untuk menentukan utas apakah daemon utas atau tidak.

Misalnya:

public class DaemonThread extends Thread {
    public void run() {
        System.out.println("Entering run method");

        try {
            System.out.println("In run Method: currentThread() is" + Thread.currentThread());

            while (true) {
                try {
                    Thread.sleep(500);
                } catch (InterruptedException x) {}

                System.out.println("In run method: woke up again");
            }
        } finally {
            System.out.println("Leaving run Method");
        }
    }
    public static void main(String[] args) {
        System.out.println("Entering main Method");

        DaemonThread t = new DaemonThread();
        t.setDaemon(true);
        t.start();

        try {
            Thread.sleep(3000);
        } catch (InterruptedException x) {}

        System.out.println("Leaving main method");
    }

}

Keluaran:

C:\java\thread>javac DaemonThread.java

C:\java\thread>java DaemonThread
Entering main Method
Entering run method
In run Method: currentThread() isThread[Thread-0,5,main]
In run method: woke up again
In run method: woke up again
In run method: woke up again
In run method: woke up again
In run method: woke up again
In run method: woke up again
Leaving main method

C:\j2se6\thread>

37

Definisi Daemon (Komputasi):

Proses latar belakang yang menangani permintaan untuk layanan seperti spooling cetak dan transfer file, dan tidak aktif ketika tidak diperlukan.

—— Sumber: Kamus Inggris oleh Oxford

Apa itu Daemon thread di Jawa?

  • Utas daemon dapat dimatikan kapan saja di antara alirannya, Non-Daemon, yaitu utas pengguna dijalankan sepenuhnya.
  • Utas daemon adalah utas yang berjalan sebentar-sebentar di latar belakang selama utas non-daemon lainnya berjalan.
  • Ketika semua utas non-daemon selesai, utas daemon berakhir secara otomatis.
  • Utas daemon adalah penyedia layanan untuk utas pengguna yang berjalan dalam proses yang sama.
  • JVM tidak peduli tentang thread daemon yang harus diselesaikan ketika dalam status Running, bahkan tidak akhirnya memblokir juga biarkan dieksekusi. JVM memberikan preferensi untuk utas non-daemon yang dibuat oleh kami.
  • Daemon threads berfungsi sebagai layanan di Windows.
  • JVM menghentikan utas daemon ketika semua utas pengguna (berbeda dengan utas daemon) dihentikan. Karenanya daemon thread dapat digunakan untuk mengimplementasikan, misalnya, fungsi pemantauan ketika utas dihentikan oleh JVM segera setelah semua utas pengguna berhenti.

jika Anda memanggil System.exit (), akhirnya tidak ada blok yang dieksekusi, terlepas dari utas yang menjadi utas daemon. memang akhirnya blok dieksekusi dalam utas daemon bahkan setelah utas pengguna terakhir berakhir jika JVM belum membunuh utas
benez

5
Utas daemon dijalankan pada prioritas yang sama dengan utas pembuatannya, kecuali jika sudah diubah sebelum memulai. Utas Daemon tidak harus 'penyedia layanan' atau layanan Windows atau apa pun yang dinyatakan di sini: mereka hanya utas yang tidak mencegah JVM untuk keluar. Titik.
Marquis of Lorne

35

Sebuah benang daemon adalah benang yang dianggap melakukan beberapa tugas di latar belakang seperti permintaan penanganan atau berbagai chronjobs yang bisa eksis dalam sebuah aplikasi.

Ketika program Anda hanya memiliki sisa daemon, ia akan keluar. Itu karena biasanya utas ini bekerja sama dengan utas normal dan memberikan latar belakang penanganan acara.

Anda dapat menentukan bahwa a Threadadalah daemon satu dengan menggunakan setDaemonmetode, mereka biasanya tidak keluar, mereka juga tidak terputus .. mereka hanya berhenti ketika aplikasi berhenti.


1
Itu karena itu adalah thread daemon, dan itulah arti dari 'daemon'. Alasan Anda kembali ke depan.
Marquis of Lorne

15

Satu kesalahpahaman yang ingin saya klarifikasi:

  • Asumsikan bahwa jika daemon utas (katakanlah B) dibuat di dalam utas pengguna (katakanlah A); lalu akhir dari utas pengguna / utas induk (A) ini tidak akan mengakhiri utas / benang utas (B) yang telah dibuatnya; asalkan pengguna thread adalah satu-satunya yang sedang berjalan.
  • Jadi tidak ada hubungan orangtua-anak pada utas berakhir. Semua utas daemon (terlepas dari di mana ia dibuat) akan berakhir setelah tidak ada utas pengguna langsung dan yang menyebabkan JVM berakhir.
  • Bahkan ini berlaku untuk keduanya (orang tua / anak) adalah thread daemon.
  • Jika child thread dibuat dari daemon thread maka itu juga merupakan thread daemon. Ini tidak memerlukan pengaturan flag thread daemon eksplisit. Demikian pula jika thread anak dibuat dari utas pengguna maka itu juga merupakan utas pengguna, jika Anda ingin mengubahnya, maka pengaturan flag daemon eksplisit diperlukan sebelum memulai utas anak tersebut.

Ini tidak dikutip dari apa pun. Jangan gunakan format kutipan untuk teks yang tidak dikutip. Paragraf pertama 'kutipan' salah, dan bertentangan dengan yang kedua.
Marquis of Lorne

@ EJP GOT IT, Jadi setiap orang harus memberikan kutipan orang lain di sini, bukan milik mereka sendiri. ATAU diri kita punya penawaran di suatu tempat lalu tunjukkan di sini?
Kanagavelu Sugumar

Ya, jika Anda mengutip seseorang yang Anda harus mengutipnya, sama seperti di tempat lain, sedikit jika Anda belum mengutip siapa pun yang tidak memformatnya. Saya tidak bisa membuat kepala atau ekor dari kalimat kedua Anda.
Marquis of Lorne

12

Daemon Thread dan User Threads. Umumnya semua utas yang dibuat oleh pemrogram adalah utas pengguna (kecuali jika Anda menetapkannya sebagai daemon atau utas induk Anda adalah utas daemon). Utas pengguna biasanya dimaksudkan untuk menjalankan kode program kami. JVM tidak berakhir kecuali semua utas pengguna berakhir.


10

Java memiliki jenis utas khusus yang disebut daemon utas.

  • Prioritas sangat rendah.
  • Hanya dieksekusi ketika tidak ada utas lain dari program yang sama berjalan.
  • JVM mengakhiri program menyelesaikan utas ini, ketika utas daemon adalah satu-satunya utas yang berjalan dalam suatu program.

Untuk apa daemon digunakan?

Biasanya digunakan sebagai penyedia layanan untuk utas normal. Biasanya memiliki loop tak terbatas yang menunggu permintaan layanan atau melakukan tugas utas. Mereka tidak dapat melakukan pekerjaan penting. (Karena kita tidak tahu kapan mereka akan memiliki waktu CPU dan mereka dapat menyelesaikannya kapan saja jika tidak ada utas lain yang berjalan.)

Contoh tipikal dari jenis utas ini adalah pengumpul sampah Jawa .

Masih ada lagi ...

  • Anda hanya memanggil setDaemon()metode sebelum memanggil start()metode. Setelah utas berjalan, Anda tidak dapat mengubah status daemonnya.
  • Gunakan isDaemon()metode untuk memeriksa apakah utas adalah utas daemon atau utas pengguna.

8
-1, saya tidak percaya bahwa utas daemon pada dasarnya rendah prioritas. Tentu saja tidak ada dokumentasi yang pernah saya lihat menyatakan seperti itu. Juga jawaban SO ini mengklaim bahwa prioritas dan daemon-ness adalah ortogonal: stackoverflow.com/a/10298353/839128
MikeFHay

5
Utas daemon tidak ada hubungannya dengan prioritas. Anda dapat memiliki utas daemon prioritas tinggi atau utas non-daemon prioritas rendah.
Gray

Thread daemon awalnya memiliki prioritas yang sama dengan utas pembuatannya.
Marquis of Lorne

Pernyataan "'Hanya dieksekusi ketika tidak ada utas lain dari program yang sama berjalan" menyesatkan.
Fredrick Gauss

9

Utas daemon seperti asisten. Utas Non-Daemon seperti pemain depan. Asisten membantu pemain untuk menyelesaikan pekerjaan. Ketika pekerjaan selesai, tidak ada bantuan yang dibutuhkan oleh pemain untuk melakukan lagi. Karena tidak diperlukan bantuan, asisten meninggalkan tempat itu. Jadi saat pekerjaan utas Non-Daemon selesai, utas Daemon pergi.


5

Utas daemon seperti utas normal kecuali bahwa JVM hanya akan dimatikan ketika utas non daemon lainnya tidak ada. Utas daemon biasanya digunakan untuk melakukan layanan untuk aplikasi Anda.


5

Daemon thread di Jawa adalah thread yang berjalan di latar dan sebagian besar dibuat oleh JVM untuk melakukan tugas latar belakang seperti pengumpulan sampah dan tugas pemeliharaan rumah lainnya.

Poin yang perlu diperhatikan:

  1. Setiap utas yang dibuat oleh utas utama, yang menjalankan metode utama di Java secara default bukan daemon karena Utas mewarisi sifat daemonnya dari Utas yang membuatnya yaitu induk Thread dan karena utas utama adalah utas non daemon, utas lain yang dibuat darinya akan tetap non-daemon sampai secara eksplisit membuat daemon dengan memanggil setDaemon (true).

  2. Thread.setDaemon (true) membuat daemon Thread tetapi hanya bisa dipanggil sebelum memulai Thread di Java. Ini akan membuang IllegalThreadStateException jika Thread yang sesuai sudah mulai dan berjalan.

Perbedaan antara utas Daemon dan Non Daemon di Jawa:

1) JVM tidak menunggu thread daemon selesai sebelum ada.

2) Daemon Thread diperlakukan berbeda dari User Thread ketika JVM berakhir, akhirnya blok tidak dipanggil, Stack tidak dilepas dan JVM baru saja keluar.


5

Di Jawa, Daemon Threads adalah salah satu jenis utas yang tidak mencegah Java Virtual Machine (JVM) keluar. Tujuan utama dari daemon thread adalah untuk menjalankan tugas latar belakang terutama dalam kasus beberapa tugas rutin berkala atau pekerjaan. Dengan keluarnya JVM, utas daemon juga mati.

Dengan menetapkan a thread.setDaemon(true), utas menjadi utas daemon. Namun, Anda hanya dapat mengatur nilai ini sebelum utas dimulai.


Apa jenis utas lain yang melakukan itu? A: Tidak ada. Ada utas daemon dan utas non-daemon, titik. Ini adalah biner, Dua negara.
Marquis dari Lorne

5

Berikut adalah contoh untuk menguji perilaku thread daemon jika jvm keluar karena tidak adanya thread pengguna.

Harap perhatikan baris terakhir kedua pada output di bawah ini, ketika utas utama keluar, daemon utas juga mati dan tidak tercetak akhirnya dieksekusi9 pernyataan dalam akhirnya blok. Ini berarti bahwa setiap sumber daya i / o yang ditutup pada akhirnya blok daemon thread tidak akan ditutup jika JVM keluar karena tidak adanya utas pengguna.

public class DeamonTreadExample {

public static void main(String[] args) throws InterruptedException {

    Thread t = new Thread(() -> {
        int count = 0;
        while (true) {
            count++;
            try {
                System.out.println("inside try"+ count);
                Thread.currentThread().sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } finally {
                System.out.println("finally executed"+ count);
            }
        }
    });
    t.setDaemon(true);
    t.start();

    Thread.currentThread().sleep(10000);
    System.out.println("main thread exited");
  }
}

Keluaran

inside try1
finally executed1
inside try2
finally executed2
inside try3
finally executed3
inside try4
finally executed4
inside try5
finally executed5
inside try6
finally executed6
inside try7
finally executed7
inside try8
finally executed8
inside try9
finally executed9
inside try10
main thread exited

4

Utas daemon adalah seperti yang semua orang jelaskan, tidak akan membatasi JVM untuk keluar, jadi pada dasarnya utas bahagia untuk Aplikasi dari sudut pandang keluar.

Ingin menambahkan bahwa daemon thread dapat digunakan ketika mengatakan saya menyediakan API seperti mendorong data ke server pihak ke-3 / atau JMS, saya mungkin perlu menggabungkan data pada level JVM klien dan kemudian mengirim ke JMS di utas terpisah. Saya dapat menjadikan utas ini sebagai utas daemon, jika ini bukan data wajib yang harus didorong ke server. Jenis data ini seperti log push / aggregation.

Salam, Manish


Berikut ini adalah program sederhana yang menampilkan daemon thread di java. journaldev.com/1072/java-daemon-thread-example
Pankaj

4

Utas daemon seperti proses daemon yang bertanggung jawab untuk mengelola sumber daya, utas daemon dibuat oleh Java VM untuk melayani utas pengguna. Contohnya memperbarui sistem untuk unix, unix adalah proses daemon. child of daemon thread selalu daemon thread, jadi secara default daemon adalah false. Anda dapat memeriksa utas sebagai daemon atau pengguna dengan menggunakan metode "isDaemon ()". jadi daemon thread atau proses daemon pada dasarnya bertanggung jawab untuk mengelola sumber daya. misalnya ketika Anda memulai jvm ada pengumpul sampah yang berjalan yaitu daemon thread yang prioritasnya adalah 1 yang terendah, yang mengelola memori. jvm masih hidup selama utas pengguna masih hidup, kamu tidak bisa membunuh daemon thread.jvm bertanggung jawab untuk mematikan utas daemon.


Sangat bingung, dan semua itu adalah non sequitur.
Marquis dari Lorne

3

Mari kita bicara hanya dalam kode dengan contoh-contoh yang berfungsi. Saya suka jawaban russ di atas tetapi untuk menghilangkan keraguan yang saya miliki, saya meningkatkannya sedikit. Saya menjalankannya dua kali, sekali dengan thread pekerja diatur ke deamon true (thread deamon) dan waktu lain setel ke false (user thread). Ini mengkonfirmasi bahwa utas deamon berakhir ketika utas utama berakhir.

public class DeamonThreadTest {

public static void main(String[] args) {

    new WorkerThread(false).start();    //set it to true and false and run twice.

    try {
        Thread.sleep(7500);
    } catch (InterruptedException e) {
        // handle here exception
    }

    System.out.println("Main Thread ending");
    }
   }

   class WorkerThread extends Thread {

    boolean isDeamon;

    public WorkerThread(boolean isDeamon) {
        // When false, (i.e. when it's a user thread),
        // the Worker thread continues to run.
        // When true, (i.e. when it's a daemon thread),
        // the Worker thread terminates when the main
        // thread terminates.
        this.isDeamon = isDeamon;
        setDaemon(isDeamon);
    }

    public void run() {
        System.out.println("I am a " + (isDeamon ? "Deamon Thread" : "User Thread (none-deamon)"));

        int counter = 0;

        while (counter < 10) {
            counter++;
            System.out.println("\tworking from Worker thread " + counter++);

            try {
                sleep(5000);
            } catch (InterruptedException e) {
                // handle exception here
            }
        }
        System.out.println("\tWorker thread ends. ");
    }
}



result when setDeamon(true)
=====================================
I am a Deamon Thread
    working from Worker thread 0
    working from Worker thread 1
Main Thread ending

Process finished with exit code 0


result when setDeamon(false)
=====================================
I am a User Thread (none-deamon)
    working from Worker thread 0
    working from Worker thread 1
Main Thread ending
    working from Worker thread 2
    working from Worker thread 3
    working from Worker thread 4
    working from Worker thread 5
    working from Worker thread 6
    working from Worker thread 7
    working from Worker thread 8
    working from Worker thread 9
    Worker thread ends. 

Process finished with exit code 0

3

Utas daemon umumnya dikenal sebagai utas "Penyedia Layanan". Utas ini tidak boleh digunakan untuk menjalankan kode program tetapi kode sistem. Utas ini berjalan paralel dengan kode Anda, tetapi JVM dapat membunuhnya kapan saja. Ketika JVM tidak menemukan utas pengguna, ia menghentikannya dan semua utas daemon berakhir secara instan. Kita dapat mengatur utas non-daemon ke daemon menggunakan:

setDaemon(true)

3
Mereka tidak 'umumnya dikenal sebagai utas "Penyedia Layanan".
Marquis of Lorne

1
Dan mereka dapat digunakan untuk mengeksekusi kode apa pun. JVM tidak dapat 'membunuh mereka kapan saja', tetapi itu akan membunuh mereka ketika tidak ada utas non-daemon berjalan.
Marquis dari Lorne

@ EJP mungkin saya salah tetapi "itu akan membunuh mereka" ketika utas non-daemon berjalan. Ketika sebuah thread adalah daemon, bukankah itu berjalan secara terpisah menahan jvm sampai dieksekusi sepenuhnya dan sekarang dikelola pada level OS.
89n3ur0n

Itu akan membunuh mereka ketika semua utas non-daemon telah keluar, dan bukan picosecond sebelumnya. Tentu bukan 'kapan saja'.
Marquis of Lorne

3

Utas daemon adalah utas yang berjalan di latar belakang selama utas non-daemon lain dari proses masih berjalan. Jadi, ketika semua utas non-daemon selesai, utas daemon diakhiri. Contoh untuk utas non-daemon adalah utas yang menjalankan Utas. Utas dibuat daemon dengan memanggilsetDaemon() metode sebelum utas dimulai

Untuk Referensi Lebih Lanjut: Daemon thread in Java


2

Bagi saya, daemon utas itu seperti penjaga rumah untuk utas pengguna. Jika semua utas pengguna selesai, utas daemon tidak memiliki pekerjaan dan dimatikan oleh JVM. Saya menjelaskannya di video YouTube .


2

JVM akan menyelesaikan pekerjaan ketika eksekusi utas non-daemon terakhir selesai. Secara default, JVM akan membuat utas sebagai nondaemon tetapi kita dapat membuat Utas sebagai daemon dengan bantuan metode setDaemon(true). Sebuah contoh yang baik dari thread Daemon adalah thread GC yang akan menyelesaikan pekerjaannya segera setelah semua thread nondaemon selesai.


bagaimana itu bisa menjadi cara kerja thread GC? Bukankah pengumpulan sampah berjalan bahkan jika utas utama program membutuhkan waktu yang sangat lama (utas utama tidak berakhir)?
Calicoder

Seperti yang saya sebutkan thread GC akan bekerja sampai akhir thread daemon NON terakhir akan menyelesaikan eksekusi itu. Utas utama program ini bukan daemon seperti yang kita ketahui maka utas GC akan menyelesaikan pekerjaan setelah utas utama selesai / terbunuh. Pada dasarnya saya ingin mengatakan bahwa thread daemon akan diakhiri ketika proses selesai, dan proses selesai ketika semua utas non daemon dijalankan.
Arman Tumanyan

Secara default, status daemon suatu utas diwarisi dari induknya.
Marquis of Lorne

-1

Utas daemon mati saat utas pencipta keluar.

Utas non-daemon (default) bahkan dapat hidup lebih lama dari utas utama.

if ( threadShouldDieOnApplicationEnd ) {
    thread.setDaemon ( true );
}
thread.start();

Ini salah. Ini bukan tentang utas pencipta. Jika ada utas APA PUN non-pengguna yang berjalan, utas daemon akan terus berjalan. Ini dapat dengan mudah diuji dengan membuat thread foreground yang memunculkan thread daemon. Bahkan setelah untaian foreground selesai join, daemon akan tetap ada selama utas utama berjalan.
Hubert Grzeskowiak

Daemon threads mati ketika JVM karena tidak ada lagi thread non-daemon runnable. Lihat Javadoc. Jawabannya sepenuhnya salah.
Marquis of Lorne
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.