Java'da hangi daemon parçacıklarının olduğunu söyleyen var mı?
Java'da hangi daemon parçacıklarının olduğunu söyleyen var mı?
Yanıtlar:
Bir arka plan programı iş parçacığı, program tamamlandığında ancak iş parçacığı hala çalıştığında JVM'nin çıkmasını engellemeyen bir iş parçacığıdır. Bir daemon iş parçacığı için örnek çöp toplama.
İş parçacığı başlamadan önce daemon özelliklerini setDaemon(boolean)
değiştirmek için yöntemi kullanabilirsiniz Thread
.
setDamon(boolean)
yalnızca konu başlatılmadan önce çağrılabilir. Varsayılan olarak, iş parçacığı üst iş parçacığının daemon durumunu devralır.
thread that does not prevent the JVM from exiting when the program finishes but the thread is still running
temel olarak, iş parçacığını başlatan JVM işleminin, daemon iş parçacığının yürütülmesi bitip bitmediğini umursamadığını, tüm normal iş parçacıklarının yürütme işlemini bitirmesi durumunda kendini sonlandıracağı anlamına gelir.
Birkaç nokta daha (Referans: Uygulamada Java Eşzamanlılığı )
Tüm arka plan programı olmayan iş parçacıkları bittiğinde, JVM durur ve kalan tüm arka plan iş parçacıkları terk edilir :
Bu nedenle daemon thread'ler az miktarda kullanılmalıdır ve bunları her türlü I / O gerçekleştirebilecek görevler için kullanmak tehlikelidir.
finally
blok yürütülmez. System.exit(…)
G / Ç yapan iş parçacıkları olabileceğini düşünüyorsanız arama yapmayın . Tek fark JVM'nin sadece daemon evreleri kaldığında kendi sonlandırmasını tetikleyeceğidir.
Yukarıdaki tüm cevaplar iyidir. İşte farkı göstermek için basit bir küçük kod snippet'i. True ve false değerlerinin her biri ile deneyin 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
}
}
}
}
Geleneksel olarak UNIX'teki arka plan süreçleri, Windows'daki hizmetlere benzer şekilde sürekli arka planda çalışan süreçlerdi.
Java'daki bir daemon iş parçacığı, JVM'nin çıkmasını engellemeyen bir iş parçacığıdır. Özellikle JVM yalnızca daemon evreleri kaldığında çıkacaktır. setDaemon()
Yöntemi çağırarak bir tane oluşturursunuz Thread
.
Daemon konularını okuyun .
Daemon iş parçacıkları, daemon iş parçacığıyla aynı işlemde çalışan diğer iş parçacıkları veya nesneler için bir hizmet sağlayıcısı gibidir. Arka plan iş parçacıkları arka plan destekleme görevleri için kullanılır ve yalnızca normal iş parçacıkları yürütülürken gereklidir. Normal iş parçacıkları çalışmıyorsa ve kalan iş parçacıkları daemon iş parçacıklarıysa, yorumlayıcı çıkar.
Örneğin, HotJava tarayıcısı, dosya sistemine veya ağa ihtiyaç duyan herhangi bir iş parçacığı için görüntü almak üzere "Görüntü Alıcısı" adlı dört adede kadar arka plan iş parçacığı kullanır.
Daemon iş parçacıkları genellikle uygulamanız / uygulamanız için ("fiddley bitlerini yüklemek" gibi) hizmetler gerçekleştirmek için kullanılır. Kullanıcı iş parçacığı ve arka plan iş parçacığı arasındaki temel fark, JVM'nin yalnızca tüm kullanıcı iş parçacıkları sonlandırıldığında bir programı kapatmasıdır. Daemon iş parçacığı, ana yürütme iş parçacığı da dahil olmak üzere artık çalışan kullanıcı iş parçacığı kalmadığında JVM tarafından sonlandırılır.
setDaemon (doğru / yanlış)? Bu yöntem, bir iş parçacığının daemon iş parçacığı olduğunu belirtmek için kullanılır.
public boolean isDaemon ()? Bu yöntem, iş parçacığının daemon iş parçacığı olup olmadığını belirlemek için kullanılır.
Örneğin:
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");
}
}
Çıktı:
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>
Yazdırma biriktirme ve dosya aktarımları gibi hizmet isteklerini işleyen ve gerekmediğinde uykuda olan bir arka plan işlemi.
-- Kaynak: Oxford Dictionaries tarafından İngilizce
Bir daemon thread , arka planda istekleri işleme veya bir uygulamada var olabilecek çeşitli chronjobs gibi bazı görevleri yaptığı düşünülen bir iş parçacığıdır.
Programınızda yalnızca arka plan programı iş parçacığı kalmışsa programdan çıkılır. Bunun nedeni genellikle bu iş parçacıklarının normal iş parçacıklarıyla birlikte çalışması ve olayların arka plan işlenmesini sağlamasıdır.
A yöntemini kullanarak Thread
bir artalan programı olduğunu belirtebilirsiniz, setDaemon
genellikle çıkmazlar, ne de kesilirler .. uygulama durduğunda dururlar.
Açıklamak istediğim bir yanlış anlama:
Daemon Konu ve Kullanıcı Konuları. Genellikle, programcı tarafından oluşturulan tüm evreler kullanıcı evresidir (bunu daemon olarak belirtmediyseniz veya ana evreniz bir daemon iş parçacığı değilse). Kullanıcı iş parçacığı genellikle program kodumuzu çalıştırmak içindir. JVM, tüm kullanıcı iş parçacığı sona ermedikçe sonlanmaz.
Java'nın daemon thread adında özel bir türü vardır .
Daemon konuları ne için kullanılır?
Normalde normal evreler için servis sağlayıcı olarak kullanılır. Genellikle, hizmet isteğini bekleyen veya iş parçacığının görevlerini yerine getiren sonsuz bir döngüye sahiptir. Önemli işler yapamazlar. (Çünkü CPU zamanlarının ne zaman olacağını bilmiyoruz ve çalışan başka bir iş parçacığı yoksa her zaman bitirebilirler.)
Bu tür ipliklerin tipik bir örneği Java çöp toplayıcıdır .
Fazlası var...
setDaemon()
Yöntemi yalnızca yöntemi çağırmadan önce çağırırsınız start()
. İş parçacığı çalıştıktan sonra, arka plan programının durumunu değiştiremezsiniz.isDaemon()
Bir iş parçacığının bir daemon iş parçacığı veya kullanıcı iş parçacığı olup olmadığını kontrol etmek için yöntemi kullanın .Daemon konuları asistan gibidir. Daemon olmayan iş parçacıkları ön performansa benzer. Asistanlar, sanatçıların bir işi tamamlamalarına yardımcı olur. İş tamamlandığında, sanatçılar tarafından artık performans göstermeleri için yardıma gerek yoktur. Yardıma ihtiyaç duyulmadığı için asistanlar yeri terk ederler. Daemon olmayan iş parçacığı işi bittiğinde, Daemon iş parçacığı uzaklaşır.
Java'daki Daemon iş parçacığı, arka planda çalışan ve çoğunlukla JVM tarafından Çöp toplama ve diğer ev tutma görevleri gibi arka plan görevleri gerçekleştirmek için oluşturulan iş parçacıklarıdır.
Dikkat Edilmesi Gereken Noktalar:
Ana iş parçacığı tarafından oluşturulan ve Java'da ana yöntemi çalıştıran herhangi bir iş parçacığı varsayılan olarak daemon değildir, çünkü iş parçacığı daemon doğasını, yani ana iş parçacığını oluşturan iş parçacığından devralır ve ana iş parçacığı daemon olmayan bir iş parçacığı olduğundan, ondan oluşturulan diğer iş parçacıkları setDaemon (true) öğesini çağırarak açıkça daemon yapılana kadar daemon olmayan olarak kalır.
Thread.setDaemon (true) bir Konu arka plan programı yapar, ancak Konu sadece Java'da başlatılmadan önce çağrılabilir. İlgili Konu zaten başlamış ve çalışıyorsa IllegalThreadStateException özel durumunu atar.
Java'da Daemon ve Daemon olmayan iş parçacığı arasındaki fark:
1) JVM, herhangi bir arka plan programının iş parçacığının bitmesini beklemez.
2) JVM sona erdiğinde Daemon İş parçacığı Kullanıcı İş parçacığından farklı olarak ele alınır, son olarak bloklar çağrılmaz, Yığınlar yaralanmaz ve JVM sadece çıkar.
Java'da Daemon Threads , Java Sanal Makinesi'nin (JVM) çıkmasını engellemeyen iş parçacığı türlerinden biridir. Bir daemon evresinin temel amacı, özellikle rutin periyodik görev veya iş durumunda arka plan görevini yürütmektir. JVM çıkışlarında, daemon thread de ölür.
A ayarlandığında thread.setDaemon(true)
, bir iş parçacığı bir daemon iş parçacığı haline gelir. Ancak, bu değeri yalnızca evre başlamadan önce ayarlayabilirsiniz.
Aşağıda, kullanıcı iş parçacıklarının bulunmaması nedeniyle jvm çıkışı durumunda daemon iş parçacıklarının davranışını sınamak için bir örnek verilmiştir.
Ana iş parçasından çıkıldığında daemon iş parçacığının da öldüğünü ve son olarak blokta son olarak execute9 ifadesini yazdırmadığını lütfen aşağıdaki çıktıdaki son son satıra dikkat edin . Bu, kullanıcı iş parçacıklarının bulunmaması nedeniyle JVM'den çıkarsa, bir daemon iş parçacığının sonunda blok içinde kapatılan herhangi bir g / Ç kaynağının kapatılmayacağı anlamına gelir.
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
Daemon iş parçacıkları herkesin açıkladığı gibi, JVM'yi çıkmak için kısıtlamayacaktır, bu nedenle temelde çıkış açısından Uygulama için mutlu bir iş parçacığıdır.
Bir üçüncü taraf sunucuya / veya JMS'ye veri aktarma gibi bir API sağladığımı söylerken daemon iş parçacıklarının kullanılabileceğini eklemek isterim, verileri istemci JVM düzeyinde toplayıp sonra ayrı bir iş parçacığında JMS'ye göndermem gerekebilir. Bu sunucuya itilmesi zorunlu bir veri değilse, daemon iş parçacığı olarak bu iş parçacığı yapabilirsiniz. Bu tür veriler, günlük push / toplama gibidir.
Saygılarımızla, Manish
Daemon iş parçacığı, kaynakların yönetiminden sorumlu olan daemon süreci gibidir, Java VM tarafından kullanıcı iş parçacıklarına hizmet etmek için bir daemon iş parçacığı oluşturulur. unix için örnek güncelleme sistemi, unix daemon işlemidir. daemon iş parçacığının alt öğesi her zaman daemon iş parçacığıdır, bu nedenle varsayılan olarak daemon false.you "isDaemon ()" yöntemini kullanarak iş parçacığını daemon veya kullanıcı olarak kontrol edebilirsiniz. bu nedenle daemon thread veya daemon process kaynakların yönetiminden temel olarak sorumludur. örneğin jvm'yi başlattığınızda, önceliği en düşük olan 1 olan ve bellek yöneten daemon iş parçacığı çalışan çöp toplayıcı vardır. jvm, kullanıcı iş parçacığı canlı olduğu sürece hayatta kalır, u daemon thread.jvm'yi öldüremez.
Sadece çalışma örnekleri ile kodda konuşalım. Yukarıdaki rus cevabını seviyorum ama sahip olduğum şüpheyi ortadan kaldırmak için biraz geliştirdim Ben bir kez iş parçacığı deamon true (deamon iş parçacığı) olarak ayarlanmış ve başka bir zaman yanlış (kullanıcı iş parçacığı) olarak ayarlanmış iki kez koştu. Ana iplik sona erdiğinde deamon ipliğinin sona erdiğini doğrular.
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
Daemon iş parçacıkları genellikle "Hizmet Sağlayıcı" iş parçacığı olarak bilinir. Bu iş parçacıkları program kodunu değil sistem kodunu yürütmek için kullanılmalıdır. Bu evreler kodunuza paralel çalışır, ancak JVM bunları istediğiniz zaman öldürebilir. JVM hiçbir kullanıcı iş parçacığı bulamadığında, onu durdurur ve tüm arka plan iş parçacıkları anında sona erer. Daemon olmayan iş parçacığını daemon'a kullanarak şu şekilde ayarlayabiliriz:
setDaemon(true)
Daemon iş parçacıkları, işlemin diğer daemon olmayan iş parçacıkları hala çalıştığı sürece arka planda çalışan iş parçacıklarıdır. Böylece, tüm daemon olmayan iş parçacıkları tamamlandığında, daemon iş parçacığı sonlandırılır. Daemon olmayan iş parçacığı için bir örnek Main çalıştıran iş parçacığıdır. Bir iş parçacığı,setDaemon()
başlamadan önce yöntemi
Daha Fazla Referans İçin: Java'da Daemon iş parçacığı
Benim için, daemon thread kullanıcı konuları için house keeper gibi. Tüm kullanıcı evreleri biterse, arka plan iş parçacığının işi yoktur ve JVM tarafından öldürülür. YouTube videosunda açıkladım .
JVM, son bir arka plan programı olmayan iş parçacığı yürütmesi tamamlandığında işi başaracaktır. Varsayılan olarak, JVM nondaemon olarak bir iş parçacığı oluşturacaktır, ancak Thread'ı bir yöntemle bir daemon olarak yapabiliriz setDaemon(true)
. Daemon iş parçacığının iyi bir örneği, tüm daemon olmayan iş parçacıkları tamamlanır tamamlanmaz çalışmasını tamamlayacak olan GC iş parçacığıdır.
Yaratıcı iş parçacığı çıktığında Daemon iş parçacıkları ölür.
Daemon olmayan iş parçacıkları (varsayılan) ana iş parçacığından daha uzun yaşayabilir.
if ( threadShouldDieOnApplicationEnd ) {
thread.setDaemon ( true );
}
thread.start();
join
düzenlendikten sonra bile , arka plan programı ana iş parçacığı çalıştığı sürece kalacaktır.
Thread
Javadoc ne olduklarını açıklar: java.sun.com/javase/6/docs/api/java/lang/Thread.html