Kann mir jemand sagen, welche Daemon-Threads in Java sind ?
java
multithreading
Rocker
quelle
quelle
Thread
Javadoc beschreibt, was sie sind: java.sun.com/javase/6/docs/api/java/lang/Thread.htmlAntworten:
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 dieThread
Daemon-Eigenschaften ändern, bevor der Thread gestartet wird.quelle
setDamon(boolean)
kann nur aufgerufen werden, bevor der Thread gestartet wurde. Standardmäßig erbt der Thread den Dämonstatus seines übergeordneten Threads.thread that does not prevent the JVM from exiting when the program finishes but the thread is still running
bedeutet 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.Noch ein paar Punkte (Referenz: Java Concurrency in der Praxis )
Wenn alle Nicht-Daemon-Threads beendet sind, wird die JVM angehalten und alle verbleibenden Daemon-Threads werden abgebrochen :
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.
quelle
finally
Blöcke ausgeführt, unabhängig davon, ob die Threads Daemon sind oder nicht. RufenSystem.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.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
.quelle
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 aufrufenThread
.Lesen Sie Daemon-Threads .
quelle
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:
Ausgabe:
quelle
Definition von Daemon (Computing):
—— Quelle: Englisch von Oxford Dictionaries
Was ist ein Daemon-Thread in Java?
quelle
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
Thread
ein DaemonsetDaemon
ist. Sie werden normalerweise nicht beendet und auch nicht unterbrochen. Sie werden nur gestoppt, wenn die Anwendung gestoppt wird.quelle
Ein Missverständnis, das ich klarstellen möchte:
quelle
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.
quelle
Java hat eine spezielle Art von Thread namens Daemon- Thread.
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...
setDaemon()
Methode nur auf, bevor Sie diestart()
Methode aufrufen . Sobald der Thread ausgeführt wird, können Sie seinen Dämonstatus nicht mehr ändern.isDaemon()
Methode, um zu überprüfen, ob ein Thread ein Daemon-Thread oder ein Benutzer-Thread ist.quelle
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.
quelle
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.
quelle
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:
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.
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.
quelle
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.quelle
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.
Ausgabe
quelle
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
quelle
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.
quelle
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.
quelle
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:
quelle
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 wirdWeitere Informationen: Daemon-Thread in Java
quelle
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 .
quelle
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.quelle
Daemon-Threads sterben ab, wenn der Ersteller-Thread beendet wird.
Nicht-Daemon-Threads (Standard) können sogar länger als der Haupt-Thread leben.
quelle
join
bearbeitet wurde, bleibt der Dämon so lange bestehen, wie der Haupt-Thread ausgeführt wird.