917 Stimmen

Was ist ein Daemon-Thread in Java?

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

25 Stimmen

En Thread javadoc beschreibt, was sie sind: java.sun.com/javase/6/docs/api/java/lang/Thread.html

1 Stimmen

4 Stimmen

Bei Daemon-Threads werden beim Anhalten 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 jede E/A nicht ordnungsgemäß beendet und bis zum Ende geschrieben/gelesen.

717voto

b_erb Punkte 20272

Ein Daemon-Thread ist ein Thread, der die JVM nicht daran hindert, sich zu beenden, wenn das Programm beendet ist, aber der Thread läuft weiter. Ein Beispiel für einen Daemon-Thread ist die Garbage Collection.

Sie können die setDaemon(boolean) Methode zum Ändern der Thread Daemon-Eigenschaften, bevor der Thread startet.

236 Stimmen

Für die Nachwelt, setDamon(boolean) kann nur aufgerufen werden, bevor der Thread gestartet wurde. Standardmäßig erbt der Thread den Daemon-Status seines Eltern-Threads.

2 Stimmen

"verhindert nicht, dass die JVM beendet wird, wenn das Programm endet, aber der Thread noch läuft", während @sateesh sagt, dass "die JVM alle verbleibenden Daemon-Threads aufgibt". Werden Daemon-Threads also beendet, wenn die JVM beendet wird?

36 Stimmen

@Gerald, ALLE Threads werden beendet, wenn die JVM beendet wird. B_erb sagte: "...wenn das Programm beendet wird." Das bedeutet, wenn das Programm die JVM nicht explizit beendet, dann beendet sich die JVM automatisch, wenn das letzte nicht -Daemon-Thread endet. Normale Threads definieren, "wann das Programm beendet wird". Dämon-Threads tun das nicht.

377voto

sateesh Punkte 26553

Ein paar weitere Punkte (Referenz: Java-Gleichzeitigkeit in der Praxis )

  • Wenn ein neuer Thread erstellt wird, erbt er den Daemon-Status seines Elternteils.
  • Wenn alle Nicht-Daemon-Threads beendet sind, wird die JVM angehalten, und alle verbleibenden Daemon-Threads werden aufgegeben :

    • finally-Blöcke werden nicht ausgeführt ,
    • Stacks werden nicht abgewickelt - die JVM beendet sich einfach.

    Aus diesem Grund sollten Daemon-Threads nur sparsam eingesetzt werden, und es ist gefährlich, sie für Aufgaben zu verwenden, die irgendeine Art von E/A durchführen könnten.

5 Stimmen

Warum sollten Daemon-Threads nicht für I/O verwendet werden? Gibt es Bedenken, dass BufferedWriters usw. nicht gespült werden?

4 Stimmen

@PaulCager Ja, sie können auch einfach mitten im Schreiben/Lesen in den Knien abgeschnitten werden.

0 Stimmen

Wäre es sicher, sie zum Schreiben in eine transaktionale Datenbank zu verwenden? Es scheint, dass selbst wenn der Thread stirbt Ihre DB würde in einem vernünftigen Zustand gelassen werden (vorausgesetzt, es war nicht etwas schreiben Sie unbedingt benötigt, wie ein aktueller Zustand, der alle paar Minuten aktualisiert wird)

202voto

russ Punkte 1961

Alle oben genannten Antworten sind gut. Hier ist ein einfacher kleiner Codeschnipsel, um den Unterschied zu verdeutlichen. Probieren Sie es mit jedem der Werte von 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 non daemon thread),
        // the WorkerThread continues to run.
        // When true, (i.e. when it's a daemon thread),
        // the WorkerThread terminates when the main 
        // thread or/and user defined thread(non daemon) 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 Stimmen

@russ Guter Codeschnipsel! Ich musste allerdings die WorkerThread-Klasse als statisch definieren.

0 Stimmen

@xli du hättest auch new DaemonTest().new WorkerThread().start() machen können :)

0 Stimmen

@russ gutes Beispiel. Ich war mir bewusst, dass die Standardeinstellung "setDeamon(false)" ist, wenn man nicht explizit "setDaemon(true)" definiert.

106voto

cletus Punkte 596503

Traditionell waren Daemon-Prozesse in UNIX solche, die ständig im Hintergrund liefen, ähnlich wie Dienste in Windows.

Ein Daemon-Thread in Java ist ein Thread, der die JVM nicht daran hindert, sich zu beenden. Insbesondere wird die JVM beendet, wenn nur noch Daemon-Threads übrig sind. Sie erzeugen einen, indem Sie die setDaemon() Methode auf Thread .

Lesen Sie den Artikel Daemon-Threads .

3 Stimmen

Ihr Link ist zu diesem Zeitpunkt tot, vielleicht möchten Sie ihn aktualisieren? wie auch immer, +1 für Sie.

2 Stimmen

Mir gefällt der Vergleich zwischen UNIX und Windows.

0 Stimmen

Beste Erklärung hier!

57voto

Okky Punkte 9970

Daemon-Threads sind eine Art Dienstleister für andere Threads oder Objekte, die im selben Prozess wie der Daemon-Thread laufen. Daemon-Threads werden für unterstützende Aufgaben im Hintergrund verwendet und werden 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.

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

Daemon-Threads werden in der Regel 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 erst dann beendet, wenn alle Benutzer-Threads beendet sind. Daemon-Threads werden von der JVM beendet, wenn keine Benutzer-Threads mehr laufen, auch nicht der Haupt-Thread der Ausführung.

setDaemon(true/false) ? 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.

Beispiel:

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

}

Ergebnis:

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>

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X