Java'da bir daemon thread nedir?


809

Java'da hangi daemon parçacıklarının olduğunu söyleyen var mı?


20
ThreadJavadoc ne olduklarını açıklar: java.sun.com/javase/6/docs/api/java/lang/Thread.html
skaffman


2
Daemon Threads için, JVM durduğunda tüm daemon iş parçacıklarından çıkılır. Bu nedenle, daemon iş parçacıkları, bunlar üzerinde temizleme yapılamayabileceğinden sık sık kullanılmamalıdır. Örneğin, herhangi bir G / Ç zarif bir şekilde çıkmaz ve sonuna kadar yazmaz / okumaz.
msj121

Yanıtlar:


631

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.


210
Posterity için, 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.
Gri

1
"JVM, program bittiğinde çıkmayı engellemiyor ancak iş parçacığı hala çalışıyor" diyor. Peki JVM çıktığında daemon iş parçacığı çalışmayı bitirir mi?
Gerald

23
@Gerald, JVM çıktığında TÜM dişler öldürülür. B_erb, "... program bittiğinde" dedi. Bunun anlamı, program açıkça JVM'yi öldürmezse, son daemon olmayan iş parçacığı bittiğinde JVM otomatik olarak kendini öldürür . Normal iş parçacıkları "program çıktığında" tanımlar. Daemon konuları yok.
Solomon Yavaş

2
Dolayısıyla bu satır thread that does not prevent the JVM from exiting when the program finishes but the thread is still runningtemel 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.
Bhargav

1
@SolomonSlow JVM sona erdiğinde hala işini yaparken bir daemon iş parçacığını (örneğin bir çöp toplayıcı) öldürmenin sonuçları nelerdir? Teşekkürler.
Venkat Ramakrishnan

340

Birkaç nokta daha (Referans: Uygulamada Java Eşzamanlılığı )

  • Yeni bir evre oluşturulduğunda, üst öğesinin daemon durumunu devralır.
  • 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 :

    • nihayet bloklar icra edilmez ,
    • yığınlar çözülmez - JVM sadece çıkar.

    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.


3
Neden arka plan dizileri G / Ç için kullanılmamalıdır? BufferedWriters vb. 'Nin temizlenmemesiyle ilgili bir endişe var mı?
Paul Cager

4
@PaulCager Evet, yazma / okumanın ortasındaki dizlerden de kesilebilirler.
Cruncher

52
İkinci nokta saçmalık. JVM durduğunda, iş parçacıklarının arka plan programı olup olmadığına bakılmaksızın tüm iş parçacıkları ölür ve hiçbir finallyblok 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.
Holger

11
"Yığınlar çözülmez" ile kastedilen nedir?
ʀɛɔʘɴ ʀɛɔʘɴ

2
@ "" gevşeme yığınları "hakkında, bunun da dahil olduğu bazı açıklamalar var: flylib.com/books/en/2.254.1.277/1
user766353 18:15

175

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
            }
        }
    }
}

2
@russ İyi kod snippet'i! WorkerThread sınıfını statik olarak tanımlamak zorunda kaldım.
xli

@xli Eğer yapmış olabilir yeni DaemonTest () yeni WorkerThread () (başlangıç) çok :)..
abhy

@russ iyi örnek. Açıkça "setDaemon (true)" tanımlamazsanız varsayılan bir "setDeamon (false)" olduğunun farkındaydım
huseyin

96

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 .


3
bağlantınız bu noktada öldü, belki güncellemek mi istiyorsunuz? neyse, senin için +1.
Jasonw

2
UNIX ve Windows arasındaki karşılaştırmayı seviyorum.
Premraj

En iyi açıklama burada!
LoveMeow

57

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>

37

Daemon'un (Bilgi İşlem) Tanımı:

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

Java'da Daemon iş parçacığı nedir?

  • Daemon iş parçacıkları akışları arasında herhangi bir zamanda kapatabilir, Daemon Olmayan yani kullanıcı iş parçacığı tamamen yürütülür.
  • Daemon iş parçacıkları, diğer daemon olmayan iş parçacıkları çalıştığı sürece arka planda aralıklı olarak çalışan iş parçacıklarıdır.
  • Daemon olmayan tüm evreler tamamlandığında, daemon evreleri otomatik olarak sona erer.
  • Daemon iş parçacıkları aynı işlemde çalışan kullanıcı iş parçacıkları için hizmet sağlayıcılardır.
  • JVM, Koşu durumunda daemon iş parçacıklarının tamamlanmasını umursamıyor, sonunda engellemenin bile yürütülmesine izin vermiyor. JVM, bizim tarafımızdan oluşturulan daemon olmayan konuları tercih eder.
  • Daemon iş parçacıkları Windows'ta hizmet görevi görür.
  • JVM, tüm kullanıcı iş parçacıkları (arka plan iş parçacıklarının aksine) sonlandırıldığında arka plan iş parçacıklarını durdurur. Böylece daemon iş parçacıkları, örneğin tüm kullanıcı iş parçacıkları durur durmaz iş parçacığı JVM tarafından durdurulduktan sonra bir izleme işlevi uygulamak için kullanılabilir.

System.exit () öğesini çağırırsanız, iş parçacığının bir daemon iş parçacığı olmasına bakılmaksızın, sonunda hiçbir blok yürütülmez. gerçekten de JVM henüz iş parçacığını öldürmediyse bile son kullanıcı iş parçacığı sonlandıktan sonra daemon iş parçacıklarında bloklar yürütülür
benez

5
Bir daemon iş parçacığı, başlamadan önce değiştirilmedikçe oluşturma iş parçacığıyla aynı önceliğe sahiptir. Daemon iş parçacığı mutlaka 'hizmet sağlayıcıları' veya Windows hizmetleri veya burada belirtilen başka bir şey değildir: sadece JVM'nin çıkmasını engellemeyen iş parçacıklarıdır. Dönemi.
Kullanıcı207421

35

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 Threadbir artalan programı olduğunu belirtebilirsiniz, setDaemongenellikle çıkmazlar, ne de kesilirler .. uygulama durduğunda dururlar.


1
Çünkü bu bir arka plan programı iş parçacığıdır ve bu 'arka plan programının' anlamıdır. Akıl yürütmeniz öne çıkıyor.
Kullanıcı207421

15

Açıklamak istediğim bir yanlış anlama:

  • Kullanıcı iş parçacığı (da A) içinde daemon iş parçacığı (B say) oluşturulduğunu varsayalım; bu kullanıcı iş parçacığının / ana iş parçacığının (A) sonlandırılması, oluşturduğu arka plan iş parçacığının / alt iş parçacığının (B) sona ermeyecektir; sağlanan kullanıcı iş parçacığı şu anda çalışan tek iş parçacığıdır.
  • Dolayısıyla, iş parçacığı sonlanmasında ebeveyn-çocuk ilişkisi yoktur. Tek bir canlı kullanıcı iş parçacığı olmadığında ve JVM'nin sona ermesine neden olduğunda tüm daemon iş parçacıkları (oluşturulduğu yerden bağımsız olarak) sona erer.
  • Bu bile her iki (ebeveyn / çocuk) daemon iş parçacıkları için geçerlidir.
  • Bir daemon iş parçacığından bir alt iş parçacığı oluşturulduysa, bu da bir daemon iş parçacığıdır. Bunun için açık bir daemon thread bayrağı ayarına gerek yoktur. Benzer şekilde, bir kullanıcı iş parçacığından bir alt iş parçacığı oluşturulduysa, bu aynı zamanda bir kullanıcı iş parçacığıysa, değiştirmek isterseniz, o alt iş parçacığının başlamasından önce açık daemon bayrak ayarı gerekir.

Bu hiçbir şeyden alıntılanmamıştır. Alıntı yapılmayan metinler için alıntı biçimlendirme kullanmayın. 'Teklifin' ilk paragrafı yanlış ve ikincisi ile çelişiyor.
Kullanıcı207421

@EJP GOT IT, Yani herkes burada değil, başkalarına teklif vermek zorunda. VEYA kendimiz bir yere alıntı yaptıktan sonra buraya işaret ediyor musunuz?
Kanagavelu Sugumar

Evet, eğer birine alıntı yapmalısınız, tıpkı başka herhangi bir yerde olduğu gibi, alıntı yapmadıysanız, sanki hiç kimseyi sanki biçimlendirmeyin. İkinci cümlenizin başına veya kuyruğuna bakamıyorum.
user207421

12

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.


10

Java'nın daemon thread adında özel bir türü vardır .

  • Çok düşük öncelik.
  • Yalnızca aynı programın başka bir iş parçacığı çalışmadığında yürütülür.
  • JAPM, daemon iş parçacığı bir programda çalışan tek iş parçacığı olduğunda, bu iş parçacıklarını bitiren programı sonlandırı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 .

8
-1, ben bir daemon thread doğal olarak düşük öncelikli olduğuna inanmıyorum. Kesinlikle hiçbir belge böyle devletler gördüm. Ayrıca bu SO yanıtı, öncelik ve
cömertliğin

5
Daemon evrelerinin öncelikle hiçbir ilgisi yoktur. Yüksek öncelikli bir daemon iş parçacığına veya düşük öncelikli daemon olmayan iş parçacığına sahip olabilirsiniz.
Gri

Bir daemon iş parçacığı başlangıçta oluşturma iş parçacığıyla aynı önceliğe sahiptir.
Kullanıcı207421

"Yalnızca aynı programın başka bir iş parçacığı çalışmadığında" ifadesi yanıltıcıdır.
Fredrick Gauss

9

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.


5

Daemon iş parçacığı normal bir iş parçacığı gibidir, ancak JVM yalnızca diğer daemon olmayan iş parçacıkları mevcut olmadığında kapanacaktır. Daemon iş parçacıkları genellikle uygulamanız için hizmet vermek üzere kullanılır.


5

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:

  1. 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.

  2. 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.


5

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.


Bunu yapan diğer iplik türleri nelerdir? C: Yok. Daemon iş parçacıkları ve daemon olmayan iş parçacıkları, nokta vardır. Bu bir ikili, İki eyalet.
user207421

5

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");
  }
}

Çıktı

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

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


Java daemon thread gösteren basit bir program. journaldev.com/1072/java-daemon-thread-example
Pankaj

4

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.


Çok şaşkın, ve bütün ' sekiler olmayanlar.
Kullanıcı207421

3

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

3

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)

3
Bunlar 'genel olarak "Hizmet Sağlayıcı" iş parçacığı "olarak bilinmez.
user207421

1
Ve herhangi bir kodu yürütmek için kullanılabilirler. JVM 'Onlara her zaman öldürmek' olamaz, ama o olacaktır çalışan hiçbir daemon evre varken onları öldürmek.
30:17

@EJP belki yanılıyorum ama daemon olmayan iş parçacığı çalışırken "onları öldürecek". Bir iş parçacığı daemon olduğunda, tamamen yürütülene ve şimdi işletim sistemi düzeyinde yönetilene kadar jvm'yi ayrı ayrı çalıştırmıyor mu?
89n3ur0n

Daha önce bir pikosaniye değil, tüm arka plan programı olmayan iş parçacıkları çıktıktan sonra onları öldürür. Kesinlikle 'herhangi bir zaman' değil.
user207421

3

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ığı


2

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 .


2

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.


GC iş parçacığı nasıl çalışır? Programın ana iş parçacığının çok uzun sürmesine rağmen (ana iş parçacığı sonlanmaz) çöp toplama işlemi çalışmıyor mu?
Calicoder

Bahsettiğim gibi GC iş parçacığı son NON arka plan programı iş parçacığının sonuna kadar çalışacaktır. Programın ana iş parçacığı daemon değildir, bu nedenle GC iş parçacığı ana iş parçacığı tamamlandıktan / öldürüldükten sonra işi başaracaktır. Temel olarak, işlem tamamlandığında daemon iş parçacıklarının sonlandırılacağını ve tüm daemon olmayan iş parçacıkları yürütüldüğünde işlemin tamamlandığını söylemek istiyorum.
Arman Tumanyan

Varsayılan olarak, bir iş parçacığının daemon durumu üst öğesinden devralınır.
user207421

-1

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();

Bu yanlış. İçerik oluşturucu konuları ile ilgili değil. Çalışan herhangi bir iş parçacığı yoksa, daemon iş parçacıkları çalışmaya devam eder. Bu, bir daemon iş parçacığı oluşturan bir ön plan iş parçacığı oluşturularak kolayca test edilebilir. Ön plan iş parçacığı joindüzenlendikten sonra bile , arka plan programı ana iş parçacığı çalıştığı sürece kalacaktır.
Hubert Grzeskowiak

Daemon iş parçacıkları JVM artık çalıştırılabilir daemon olmayan iş parçacığı olmadığında ölür. Javadoc'a bakın. Cevap tamamen yanlış.
user207421
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.