Daemon-Threads in Java

Daemon-Threads in Java

1. Überblick

In diesem kurzen Artikel werfen wir einen Blick auf Daemon-Threads in Java und sehen, wofür sie verwendet werden können. Wir werden auch den Unterschied zwischen Daemon-Threads und Benutzer-Threads erläutern.

2. Unterschied zwischen Daemon- und User-Threads

Java bietet zwei Arten von Threads: Benutzerthreads und Daemon-Threads.

Benutzerthreads sind Threads mit hoher Priorität. The JVM will wait for any user thread to complete its task before terminating it.

Andererseits istdaemon threads are low-priority threads whose only role is to provide services to user threads.

Da Daemon-Threads dazu gedacht sind, Benutzer-Threads zu bedienen und nur während der Ausführung von Benutzer-Threads benötigt werden, verhindern sie nicht, dass die JVM beendet wird, sobald alle Benutzer-Threads ihre Ausführung abgeschlossen haben.

Aus diesem Grund verursachen Endlosschleifen, die normalerweise in Daemon-Threads vorhanden sind, keine Probleme, da Code, einschließlich derfinally-Blöcke, nicht ausgeführt wird, sobald alle Benutzer-Threads ihre Ausführung abgeschlossen haben. Aus diesem Grund istdaemon threads are not recommended for I/O tasks.

Es gibt jedoch Ausnahmen von dieser Regel. Schlecht gestalteter Code in Daemon-Threads kann das Beenden der JVM verhindern. Wenn Sie beispielsweiseThread.join() in einem laufenden Daemon-Thread aufrufen, kann dies das Herunterfahren der Anwendung blockieren.

3. Verwendung von Daemon-Threads

Daemon-Threads sind nützlich, um im Hintergrund Aufgaben wie die Garbage Collection zu unterstützen, den Speicher für nicht verwendete Objekte freizugeben und unerwünschte Einträge aus dem Cache zu entfernen. Die meisten JVM-Threads sind Daemon-Threads.

4. Erstellen eines Daemon-Threads

Um einen Thread als Daemon-Thread festzulegen, müssen wir nurThread.setDaemon(). aufrufen. In diesem Beispiel verwenden wir die KlasseNewThread, die die KlasseThread erweitert:

NewThread daemonThread = new NewThread();
daemonThread.setDaemon(true);
daemonThread.start();

Any thread inherits the daemon status of the thread that created it. Da der Hauptthread ein Benutzer-Thread ist, ist jeder Thread, der innerhalb der Hauptmethode erstellt wird, standardmäßig ein Benutzer-Thread.

Die MethodesetDaemon() kann nur aufgerufen werden, nachdem das ObjektThread erstellt und der Thread nicht gestartet wurde. Ein Versuch,setDaemon() aufzurufen, während ein Thread ausgeführt wird, löstIllegalThreadStateException aus:

@Test(expected = IllegalThreadStateException.class)
public void whenSetDaemonWhileRunning_thenIllegalThreadStateException() {
    NewThread daemonThread = new NewThread();
    daemonThread.start();
    daemonThread.setDaemon(true);
}

5. Überprüfen, ob ein Thread ein Daemon-Thread ist

Um zu überprüfen, ob ein Thread ein Daemon-Thread ist, können wir einfach die MethodeisDaemon() aufrufen:

@Test
public void whenCallIsDaemon_thenCorrect() {
    NewThread daemonThread = new NewThread();
    NewThread userThread = new NewThread();
    daemonThread.setDaemon(true);
    daemonThread.start();
    userThread.start();

    assertTrue(daemonThread.isDaemon());
    assertFalse(userThread.isDaemon());
}

6. Fazit

In diesem kurzen Tutorial haben wir gesehen, was Daemon-Threads sind und wofür sie in einigen praktischen Szenarien verwendet werden können.

Wie immer ist die Vollversion des Codesover on GitHub verfügbar.