Was ist ein Daemon-Thread in Java?

809

Kann mir jemand sagen, welche Daemon-Threads in Java sind ?

Rocker
quelle
20
Der ThreadJavadoc beschreibt, was sie sind: java.sun.com/javase/6/docs/api/java/lang/Thread.html
Skaffman
2
Bei Daemon-Threads werden beim Stoppen der JVM alle Daemon-Threads beendet. Aus diesem Grund sollten Daemon-Threads nicht häufig verwendet werden, da sie möglicherweise nicht bereinigt werden. Zum Beispiel würde eine E / A nicht ordnungsgemäß beendet und bis zum Ende geschrieben / gelesen.
msj121

Antworten:

631

Ein Daemon-Thread ist ein Thread, der nicht verhindert, dass die JVM beendet wird, wenn das Programm beendet wird, der Thread jedoch noch ausgeführt wird. Ein Beispiel für einen Daemon-Thread ist die Garbage Collection.

Mit dieser setDaemon(boolean)Methode können Sie die ThreadDaemon-Eigenschaften ändern, bevor der Thread gestartet wird.

b_erb
quelle
210
Für die Nachwelt setDamon(boolean)kann nur aufgerufen werden, bevor der Thread gestartet wurde. Standardmäßig erbt der Thread den Dämonstatus seines übergeordneten Threads.
Grau
1
"Verhindert nicht, dass die JVM beendet wird, wenn das Programm beendet wird, aber der Thread noch ausgeführt wird", während @sateesh sagt, dass "JVM alle verbleibenden Daemon-Threads anhält, die abgebrochen werden". Werden Daemon-Threads beendet, wenn JVM beendet wird?
Gerald
23
@Gerald, ALLE Threads werden beim Beenden der JVM beendet. B_erb sagte: "... wenn das Programm beendet ist." Das heißt, wenn das Programm die JVM nicht explizit beendet, beendet sich die JVM automatisch, wenn der letzte Nicht- Daemon-Thread endet. Normale Threads definieren "wenn das Programm beendet wird". Daemon-Threads nicht.
Solomon Slow
2
Diese Zeile thread that does not prevent the JVM from exiting when the program finishes but the thread is still runningbedeutet also im Grunde, dass es dem JVM-Prozess, der den Thread gestartet hat, egal ist, ob der Daemon-Thread die Ausführung beendet hat oder nicht. Er endet nur von selbst, wenn alle normalen Threads die Ausführung beendet haben.
Bhargav
1
@SolomonSlow Was sind die Konsequenzen, wenn ein Daemon-Thread (z. B. ein Garbage Collector) beendet wird, während er seine Arbeit noch erledigt, wenn die JVM endet? Vielen Dank.
Venkat Ramakrishnan
340

Noch ein paar Punkte (Referenz: Java Concurrency in der Praxis )

  • Wenn ein neuer Thread erstellt wird, erbt er den Dämonstatus seines übergeordneten Threads.
  • Wenn alle Nicht-Daemon-Threads beendet sind, wird die JVM angehalten und alle verbleibenden Daemon-Threads werden abgebrochen :

    • Schließlich werden Blöcke nicht ausgeführt .
    • Stapel werden nicht abgewickelt - die JVM wird einfach beendet.

    Aus diesem Grund sollten Daemon-Threads sparsam verwendet werden, und es ist gefährlich, sie für Aufgaben zu verwenden, bei denen möglicherweise E / A-Vorgänge ausgeführt werden.

Sateesh
quelle
3
Warum sollten Daemon-Threads nicht für E / A verwendet werden? Ist es ein Problem, dass BufferedWriters usw. nicht gespült werden?
Paul Cager
4
@PaulCager Ja, sie können auch mitten im Schreiben / Lesen an den Knien abgeschnitten werden.
Cruncher
52
Der zweite Punkt ist Unsinn. Wenn die JVM angehalten wird, sterben alle Threads ab und es werden keine finallyBlöcke ausgeführt, unabhängig davon, ob die Threads Daemon sind oder nicht. Rufen System.exit(…)Sie also nicht an, wenn Sie der Meinung sind, dass möglicherweise Threads ausgeführt werden, die E / A ausführen. Der einzige Unterschied besteht darin, dass die JVM ihre eigene Beendigung auslöst, wenn nur noch Daemon-Threads übrig sind.
Holger
11
Was ist mit "Stapel werden nicht abgewickelt" gemeint?
21 ʀɛɔʘɴ
2
@ ɢʜʘʂʈʀɛɔʘɴ Es gibt einige Erklärungen zu "Abwickeln von Stapeln", einschließlich dieser: flylib.com/books/de/2.254.1.277/1
user766353
175

Alle obigen Antworten sind gut. Hier ist ein einfaches kleines Code-Snippet, um den Unterschied zu veranschaulichen. Versuchen Sie es mit jedem der Werte true und 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
            }
        }
    }
}
russ
quelle
2
@russ Gutes Code-Snippet! Ich musste die WorkerThread-Klasse jedoch als statisch definieren.
xli
@xli du hättest einen neuen DaemonTest () machen können. einen neuen WorkerThread (). start () auch :)
abhy
@russ gutes Beispiel. Mir war bewusst, dass die Standardeinstellung "setDeamon (false)" ist, wenn Sie "setDaemon (true)" nicht explizit definieren
huseyin
96

Traditionell waren Daemon-Prozesse unter UNIX solche, die ständig im Hintergrund ausgeführt wurden, ähnlich wie Dienste unter Windows.

Ein Daemon-Thread in Java verhindert nicht, dass die JVM beendet wird. Insbesondere wird die JVM beendet, wenn nur noch Daemon-Threads übrig sind. Sie erstellen eine, indem Sie die setDaemon()Methode aufrufen Thread.

Lesen Sie Daemon-Threads .

Cletus
quelle
3
Ihr Link ist zu diesem Zeitpunkt tot. Vielleicht möchten Sie ihn aktualisieren? sowieso +1 für dich.
Jasonw
2
Ich mag den Vergleich zwischen UNIX und Windows.
Premraj
Beste Erklärung hier!
LoveMeow
57

Daemon-Threads sind wie Dienstanbieter für andere Threads oder Objekte, die im selben Prozess wie der Daemon-Thread ausgeführt werden. Daemon-Threads werden für unterstützende Hintergrundaufgaben verwendet und nur benötigt, während normale Threads ausgeführt werden. Wenn keine normalen Threads ausgeführt werden und die verbleibenden Threads Daemon-Threads sind, wird der Interpreter beendet.

Beispielsweise verwendet der HotJava-Browser bis zu vier Daemon-Threads mit dem Namen "Image Fetcher", um Bilder aus dem Dateisystem oder Netzwerk für jeden Thread abzurufen, der einen benötigt.

Daemon-Threads werden normalerweise verwendet, um Dienste für Ihre Anwendung / Ihr Applet auszuführen (z. B. das Laden der "Fiddley-Bits"). Der Hauptunterschied zwischen Benutzer-Threads und Daemon-Threads besteht darin, dass die JVM ein Programm nur herunterfährt, wenn alle Benutzer-Threads beendet wurden. Daemon-Threads werden von der JVM beendet, wenn keine Benutzer-Threads mehr ausgeführt werden, einschließlich des Hauptausführungsthreads.

setDaemon (wahr / falsch)? Diese Methode wird verwendet, um anzugeben, dass ein Thread ein Daemon-Thread ist.

public boolean isDaemon ()? Diese Methode wird verwendet, um festzustellen, ob der Thread ein Daemon-Thread ist oder nicht.

Z.B:

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

}

Ausgabe:

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>
Okky
quelle
37

Definition von Daemon (Computing):

Ein Hintergrundprozess, der Anforderungen für Dienste wie Druckspooling und Dateiübertragungen verarbeitet und inaktiv ist, wenn er nicht benötigt wird.

—— Quelle: Englisch von Oxford Dictionaries

Was ist ein Daemon-Thread in Java?

  • Daemon-Threads können jederzeit zwischen ihren Flows heruntergefahren werden. Nicht-Daemon-Threads werden vollständig ausgeführt.
  • Daemon-Threads sind Threads, die zeitweise im Hintergrund ausgeführt werden, solange andere Nicht-Daemon-Threads ausgeführt werden.
  • Wenn alle Nicht-Daemon-Threads abgeschlossen sind, werden Daemon-Threads automatisch beendet.
  • Daemon-Threads sind Dienstanbieter für Benutzer-Threads, die im selben Prozess ausgeführt werden.
  • Die JVM kümmert sich nicht darum, dass Daemon-Threads im laufenden Zustand abgeschlossen werden, nicht einmal endgültig blockieren, sondern auch ausführen lassen. JVM bevorzugt Nicht-Daemon-Threads, die von uns erstellt wurden.
  • Daemon-Threads fungieren in Windows als Dienste.
  • Die JVM stoppt die Daemon-Threads, wenn alle Benutzer-Threads (im Gegensatz zu den Daemon-Threads) beendet werden. Daher können Daemon-Threads verwendet werden, um beispielsweise eine Überwachungsfunktion zu implementieren, wenn der Thread von der JVM gestoppt wird, sobald alle Benutzer-Threads gestoppt wurden.
Premraj
quelle
Wenn Sie System.exit () aufrufen, werden keine endgültigen Blöcke ausgeführt, unabhängig davon, ob der Thread ein Daemon-Thread ist. In der Tat werden schließlich Blöcke in Daemon-Threads ausgeführt, selbst nachdem der letzte Benutzer-Thread beendet wurde, wenn die JVM den Thread noch nicht beendet hat
benez
5
Ein Daemon-Thread wird mit derselben Priorität wie sein Erstellungs-Thread ausgeführt, es sei denn, er wurde vor dem Start geändert. Daemon-Threads sind nicht unbedingt "Dienstanbieter" oder Windows-Dienste oder irgendetwas anderes, was hier angegeben wird: Sie sind nur Threads, die das Beenden der JVM nicht verhindern. Zeitraum.
Marquis von Lorne
35

Ein Daemon-Thread ist ein Thread, bei dem einige Aufgaben im Hintergrund ausgeführt werden, z. B. das Behandeln von Anforderungen oder verschiedene Chronjobs, die in einer Anwendung vorhanden sein können.

Wenn Ihr Programm nur noch Daemon-Threads hat, wird es beendet. Dies liegt daran, dass diese Threads normalerweise mit normalen Threads zusammenarbeiten und die Hintergrundbehandlung von Ereignissen ermöglichen.

Sie können mithilfe der Methode angeben, dass a Threadein DaemonsetDaemon ist. Sie werden normalerweise nicht beendet und auch nicht unterbrochen. Sie werden nur gestoppt, wenn die Anwendung gestoppt wird.

Jack
quelle
1
Das liegt daran, dass es sich um einen Daemon-Thread handelt, und das ist die Bedeutung von 'Daemon'. Ihre Argumentation ist von hinten nach vorne.
Marquis von Lorne
15

Ein Missverständnis, das ich klarstellen möchte:

  • Angenommen, wenn ein Daemon-Thread (z. B. B) innerhalb des Benutzerthreads (z. B. A) erstellt wird; Durch das Beenden dieses Benutzer-Threads / übergeordneten Threads (A) wird der von ihm erstellte Daemon-Thread / untergeordnete Thread (B) nicht beendet. vorausgesetzt, der Benutzerthread ist der einzige, der derzeit ausgeführt wird.
  • Es gibt also keine Eltern-Kind-Beziehung zum Thread-Ende. Alle Daemon-Threads (unabhängig davon, wo sie erstellt wurden) werden beendet, sobald kein einzelner Live-Benutzer-Thread vorhanden ist und JVM beendet wird.
  • Auch dies gilt für beide (Eltern / Kind) sind Daemon-Threads.
  • Wenn ein untergeordneter Thread aus einem Daemon-Thread erstellt wurde, ist dies auch ein Daemon-Thread. Dies erfordert keine explizite Einstellung des Daemon-Thread-Flags. Wenn ein untergeordneter Thread aus einem Benutzer-Thread erstellt wurde, ist dies ebenfalls ein Benutzer-Thread. Wenn Sie ihn ändern möchten, ist vor dem Start dieses untergeordneten Threads eine explizite Einstellung des Daemon-Flags erforderlich.
Kanagavelu Sugumar
quelle
Dies wird aus nichts zitiert. Verwenden Sie die Anführungszeichenformatierung nicht für Text, der nicht in Anführungszeichen steht. Der erste Absatz des 'Zitats' ist falsch und widerspricht dem zweiten.
Marquis von Lorne
@EJP GOT IT, also muss jeder hier anderen Leuten ein Zitat geben, nicht ihrem eigenen. ODER haben wir irgendwo ein Zitat dann hier zeigen?
Kanagavelu Sugumar
Ja, wenn Sie jemanden zitieren, müssen Sie ihn zitieren, genau wie überall sonst. Wenn Sie niemanden zitiert haben, formatieren Sie ihn nicht so, als ob Sie ihn hätten. Ich kann aus deinem zweiten Satz weder Kopf noch Schwanz machen.
Marquis von Lorne
12

Daemon-Thread und Benutzer-Threads. Im Allgemeinen sind alle vom Programmierer erstellten Threads Benutzer-Threads (es sei denn, Sie geben an, dass es sich um einen Daemon handelt oder Ihr übergeordneter Thread ist ein Daemon-Thread). Benutzer-Threads sind im Allgemeinen dazu gedacht, unseren Programmcode auszuführen. JVM wird erst beendet, wenn alle Benutzer-Threads beendet sind.

Soubhagini
quelle
10

Java hat eine spezielle Art von Thread namens Daemon- Thread.

  • Sehr niedrige Priorität.
  • Wird nur ausgeführt, wenn kein anderer Thread desselben Programms ausgeführt wird.
  • JVM beendet das Programm und beendet diese Threads, wenn Daemon-Threads die einzigen Threads sind, die in einem Programm ausgeführt werden.

Wofür werden Daemon-Threads verwendet?

Wird normalerweise als Dienstanbieter für normale Threads verwendet. Normalerweise haben Sie eine Endlosschleife, die auf die Serviceanforderung wartet oder die Aufgaben des Threads ausführt. Sie können keine wichtigen Aufgaben erledigen. (Weil wir nicht wissen, wann sie CPU-Zeit haben werden und sie jederzeit beenden können, wenn keine anderen Threads ausgeführt werden.)

Ein typisches Beispiel für diese Art von Threads ist der Java Garbage Collector .

Es gibt mehr...

  • Sie rufen die setDaemon()Methode nur auf, bevor Sie die start()Methode aufrufen . Sobald der Thread ausgeführt wird, können Sie seinen Dämonstatus nicht mehr ändern.
  • Verwenden Sie die isDaemon()Methode, um zu überprüfen, ob ein Thread ein Daemon-Thread oder ein Benutzer-Thread ist.
zxholy
quelle
8
-1, ich glaube nicht, dass ein Daemon-Thread von Natur aus eine niedrige Priorität hat. Sicherlich keine Dokumentation, die ich gesehen habe, sagt solche. Auch diese SO-Antwort behauptet, dass Priorität und Daemon-Ness orthogonal sind: stackoverflow.com/a/10298353/839128
MikeFHay
5
Daemon-Threads haben nichts mit Priorität zu tun. Sie können einen Daemon-Thread mit hoher Priorität oder einen Nicht-Daemon-Thread mit niedriger Priorität haben.
Grau
Ein Daemon-Thread hat anfangs dieselbe Priorität wie sein Erstellungs-Thread.
Marquis von Lorne
Die Aussage "Wird nur ausgeführt, wenn kein anderer Thread desselben Programms ausgeführt wird" ist irreführend.
Fredrick Gauss
9

Daemon-Threads sind wie Assistenten. Nicht-Daemon-Threads sind wie Front-Performer. Assistenten helfen den Darstellern, einen Job zu erledigen. Wenn der Auftrag abgeschlossen ist, benötigen die Darsteller keine Hilfe mehr, um die Leistung zu erbringen. Da keine Hilfe benötigt wird, verlassen die Assistenten den Ort. Wenn die Jobs von Nicht-Daemon-Threads beendet sind, marschieren Daemon-Threads weg.

Harjit Singh
quelle
5

Daemon-Thread ist wie ein normaler Thread, außer dass die JVM nur heruntergefahren wird, wenn die anderen Nicht-Daemon-Threads nicht vorhanden sind. Daemon-Threads werden normalerweise verwendet, um Dienste für Ihre Anwendung auszuführen.

Chanikag
quelle
5

Daemon-Thread in Java sind solche Threads, die im Hintergrund ausgeführt werden und hauptsächlich von JVM für die Ausführung von Hintergrundaufgaben wie Garbage Collection und anderen Haushaltsaufgaben erstellt wurden.

Zu beachtende Punkte:

  1. Jeder vom Hauptthread erstellte Thread, der die Hauptmethode in Java ausführt, ist standardmäßig kein Daemon, da der Thread seine Daemon-Natur vom Thread erbt, der ihn erstellt, dh vom übergeordneten Thread, und da der Hauptthread ein Nicht-Daemon-Thread ist, wird jeder andere daraus erstellte Thread Bleiben Sie kein Daemon, bis Sie durch Aufrufen von setDaemon (true) explizit zum Daemon gemacht werden.

  2. Thread.setDaemon (true) erstellt einen Thread-Daemon, der jedoch nur vor dem Starten von Thread in Java aufgerufen werden kann. Es wird eine IllegalThreadStateException ausgelöst, wenn der entsprechende Thread bereits gestartet ist und ausgeführt wird.

Unterschied zwischen Daemon- und Non-Daemon-Thread in Java:

1) JVM wartet nicht, bis ein Daemon-Thread beendet ist, bevor er vorhanden ist.

2) Daemon-Thread werden anders behandelt als User-Thread, wenn JVM beendet wird, schließlich werden Blöcke nicht aufgerufen, Stacks werden nicht abgewickelt und JVM wird einfach beendet.

Aniket Thakur
quelle
5

In Java sind Daemon-Threads einer der Thread-Typen, die das Beenden von Java Virtual Machine (JVM) nicht verhindern. Der Hauptzweck eines Daemon-Threads besteht darin, eine Hintergrundaufgabe auszuführen, insbesondere im Fall einer routinemäßigen periodischen Aufgabe oder Arbeit. Bei JVM-Exits stirbt auch der Daemon-Thread.

Durch Setzen von a thread.setDaemon(true)wird ein Thread zu einem Daemon-Thread. Sie können diesen Wert jedoch nur vor dem Start des Threads festlegen.

Java Guru
quelle
Was sind die anderen Arten von Threads, die das tun? A: Keine. Es gibt Daemon-Threads und Nicht-Daemon-Threads, Punkt. Es ist eine Binärzahl, zwei Zustände.
Marquis von Lorne
5

Hier ist ein Beispiel zum Testen des Verhaltens von Daemon-Threads im Falle eines JVM-Exits aufgrund des Fehlens von Benutzer-Threads.

Bitte beachten Sie, dass die zweitletzte Zeile in der Ausgabe unten beim Beenden des Hauptthreads auch der Daemon-Thread gestorben ist und die Anweisung finally execute9 innerhalb des Blocks finally nicht gedruckt hat . Dies bedeutet, dass alle E / A-Ressourcen, die innerhalb des endgültigen Blocks eines Daemon-Threads geschlossen wurden, nicht geschlossen werden, wenn JVM aufgrund des Fehlens von Benutzer-Threads beendet wird.

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

Ausgabe

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
Bharat Sharma
quelle
4

Daemon-Threads sind, wie jeder erklärt hat, nicht gezwungen, JVM zu beenden, daher ist es im Grunde genommen ein fröhlicher Thread für die Anwendung aus der Sicht des Exits.

Wenn Sie hinzufügen möchten, dass Daemon-Threads verwendet werden können, wenn ich beispielsweise eine API wie das Pushen von Daten an einen Server / oder ein JMS eines Drittanbieters bereitstelle, muss ich möglicherweise Daten auf Client-JVM-Ebene aggregieren und dann in einem separaten Thread an JMS senden. Ich kann diesen Thread als Daemon-Thread erstellen, wenn dies keine obligatorischen Daten sind, die an den Server übertragen werden sollen. Diese Art von Daten ist wie Protokoll-Push / Aggregation.

Grüße, Manish

Manish Malhotra
quelle
Hier ist ein einfaches Programm, das den Daemon-Thread in Java zeigt. journaldev.com/1072/java-daemon-thread-example
Pankaj
4

Daemon-Thread ist wie ein Daemon-Prozess, der für die Verwaltung von Ressourcen verantwortlich ist. Ein Daemon-Thread wird von der Java-VM erstellt, um die Benutzer-Threads zu bedienen. Beispiel für die Aktualisierung des Systems für Unix, Unix ist ein Daemon-Prozess. Das untergeordnete Element des Daemon-Threads ist immer ein Daemon-Thread, daher ist der Daemon standardmäßig false. Sie können den Thread als Daemon oder Benutzer mithilfe der Methode "isDaemon ()" überprüfen. Daher sind Daemon-Threads oder Daemon-Prozesse grundsätzlich für die Verwaltung von Ressourcen verantwortlich. Wenn Sie beispielsweise jvm starten, wird ein Garbage Collector ausgeführt, bei dem es sich um einen Daemon-Thread handelt, dessen Priorität 1 ist, der am niedrigsten ist und der den Speicher verwaltet. jvm ist am Leben, solange der Benutzer-Thread aktiv ist. Sie können den Daemon-Thread nicht beenden. jvm ist dafür verantwortlich, Daemon-Threads zu beenden.

user2663609
quelle
Sehr verwirrt, und alle so sind keine Sequituren.
Marquis von Lorne
3

Sprechen wir nur im Code mit Arbeitsbeispielen. Ich mag Russ 'Antwort oben, aber um jeden Zweifel zu beseitigen, den ich hatte, habe ich sie ein wenig verbessert. Ich habe es zweimal ausgeführt, einmal mit dem Worker-Thread auf deamon true (deamon-Thread) und ein anderes Mal auf false (User-Thread). Es bestätigt, dass der Deamon-Thread endet, wenn der Haupt-Thread endet.

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
Tony
quelle
3

Daemon-Threads werden allgemein als "Service Provider" -Thread bezeichnet. Diese Threads sollten nicht zum Ausführen von Programmcode, sondern von Systemcode verwendet werden. Diese Threads laufen parallel zu Ihrem Code, aber JVM kann sie jederzeit beenden. Wenn JVM keine Benutzer-Threads findet, wird es gestoppt und alle Daemon-Threads werden sofort beendet. Wir können Nicht-Daemon-Thread auf Daemon setzen, indem wir:

setDaemon(true)
Pankti
quelle
3
Sie sind nicht allgemein als "Dienstanbieter" -Threads bekannt.
Marquis von Lorne
1
Und sie können verwendet werden, um beliebigen Code auszuführen. Die JVM kann sie nicht "jederzeit töten", aber sie werden sie töten, wenn keine Nicht-Daemon-Threads ausgeführt werden.
Marquis von Lorne
@EJP Vielleicht irre ich mich, aber "es wird sie töten", wenn Nicht-Daemon-Threads ausgeführt werden. Wenn ein Thread ein Daemon ist, wird er nicht separat ausgeführt, wobei der JVM gehalten wird, bis er vollständig ausgeführt wird und jetzt auf Betriebssystemebene verwaltet wird.
89n3ur0n
Es wird sie töten, wenn alle Nicht-Daemon-Threads beendet wurden und keine Pikosekunde zuvor. Mit Sicherheit nicht "zu jeder Zeit".
Marquis von Lorne
3

Daemon-Threads sind Threads, die im Hintergrund ausgeführt werden, solange andere Nicht-Daemon-Threads des Prozesses noch ausgeführt werden. Wenn alle Nicht-Daemon-Threads abgeschlossen sind, werden die Daemon-Threads beendet. Ein Beispiel für den Nicht-Daemon-Thread ist der Thread, auf dem Main ausgeführt wird. Ein Thread wird zum Daemon gemacht, indem die setDaemon()Methode aufgerufen wird, bevor der Thread gestartet wird

Weitere Informationen: Daemon-Thread in Java

Sai Sunder
quelle
2

Für mich ist Daemon-Thread wie ein House Keeper für Benutzer-Threads. Wenn alle Benutzer-Threads beendet sind, hat der Daemon-Thread keinen Job und wird von JVM beendet. Ich habe es im YouTube-Video erklärt .

Gregory Nozik
quelle
2

JVM führt die Arbeit aus, wenn eine letzte Nicht-Daemon-Thread-Ausführung abgeschlossen ist. Standardmäßig erstellt JVM einen Thread als Nondaemon, aber wir können Thread mithilfe der Methode als Daemon erstellen setDaemon(true). Ein gutes Beispiel für einen Daemon-Thread ist der GC-Thread, der seine Arbeit abschließt, sobald alle Nondaemon-Threads abgeschlossen sind.

Arman Tumanyan
quelle
Wie kann der GC-Thread so funktionieren? Wird die Garbage Collection nicht ausgeführt, auch wenn der Hauptthread des Programms sehr lange dauert (der Hauptthread wird nicht beendet)?
Calicoder
Wie bereits erwähnt, funktioniert der GC-Thread bis zum Ende des letzten NON-Daemon-Threads. Der Hauptthread des Programms ist kein Daemon, da wir wissen, dass der GC-Thread die Arbeit erledigt, sobald der Hauptthread abgeschlossen / beendet ist. Grundsätzlich möchte ich sagen, dass Daemon-Threads beendet werden, wenn der Prozess abgeschlossen ist, und der Prozess abgeschlossen ist, wenn alle Nicht-Daemon-Threads ausgeführt werden.
Arman Tumanyan
Standardmäßig wird der Dämonstatus eines Threads von seinem übergeordneten Thread geerbt.
Marquis von Lorne
-1

Daemon-Threads sterben ab, wenn der Ersteller-Thread beendet wird.

Nicht-Daemon-Threads (Standard) können sogar länger als der Haupt-Thread leben.

if ( threadShouldDieOnApplicationEnd ) {
    thread.setDaemon ( true );
}
thread.start();
hans wurst
quelle
Das ist falsch. Es geht nicht um Ersteller-Threads. Wenn ein Nicht-Benutzer-Thread ausgeführt wird, werden die Daemon-Threads weiterhin ausgeführt. Dies kann leicht getestet werden, indem ein Vordergrund-Thread erstellt wird, der einen Daemon-Thread erzeugt. Auch nachdem der Vordergrund-Thread joinbearbeitet wurde, bleibt der Dämon so lange bestehen, wie der Haupt-Thread ausgeführt wird.
Hubert Grzeskowiak
Daemon-Threads sterben ab, wenn die JVM keine ausführbaren Nicht-Daemon-Threads mehr ausführt. Siehe den Javadoc. Die Antwort ist völlig falsch.
Marquis von Lorne