Adakah yang bisa memberi tahu saya apa thread daemon di Jawa ?
Adakah yang bisa memberi tahu saya apa thread daemon di Jawa ?
Jawaban:
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 Thread
properti daemon sebelum utas dimulai.
setDamon(boolean)
hanya bisa dipanggil sebelum utas dimulai. Secara default utas mewarisi status daemon utas induknya.
thread that does not prevent the JVM from exiting when the program finishes but the thread is still running
pada 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.
Beberapa poin lagi (Referensi: Java Concurrency in Practice )
Ketika semua utas non-daemon selesai, JVM berhenti, dan utas daemon lainnya ditinggalkan :
Karena alasan ini, daemon thread harus digunakan dengan hemat, dan berbahaya untuk menggunakannya untuk tugas-tugas yang dapat melakukan segala jenis I / O.
finally
blok 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.
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
}
}
}
}
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 .
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>
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
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 Thread
adalah daemon satu dengan menggunakan setDaemon
metode, mereka biasanya tidak keluar, mereka juga tidak terputus .. mereka hanya berhenti ketika aplikasi berhenti.
Satu kesalahpahaman yang ingin saya klarifikasi:
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.
Java memiliki jenis utas khusus yang disebut daemon utas.
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 ...
setDaemon()
metode sebelum memanggil start()
metode. Setelah utas berjalan, Anda tidak dapat mengubah status daemonnya.isDaemon()
metode untuk memeriksa apakah utas adalah utas daemon atau utas pengguna.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.
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:
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).
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.
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.
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");
}
}
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
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
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.
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
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)
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
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 .
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.
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();
join
, daemon akan tetap ada selama utas utama berjalan.
Thread
javadoc menggambarkan apa yang mereka: java.sun.com/javase/6/docs/api/java/lang/Thread.html