Daemon-Threads in Java

1. Übersicht

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 erklären.

2. Unterschied zwischen Daemon- und User-Threads

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

Benutzer-Threads sind Threads mit hoher Priorität. Die JVM wartet, bis ein Benutzer-Thread seine Aufgabe abgeschlossen hat, bevor sie beendet wird.

Auf der anderen Seite sind Daemon-Threads Threads mit niedriger Priorität, deren einzige Rolle darin besteht, Dienste für Benutzer-Threads bereitzustellen.

Da Daemon-Threads Benutzer-Threads bedienen sollen 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 der finally- Blöcke, nicht ausgeführt wird, sobald alle Benutzer-Threads ihre Ausführung abgeschlossen haben. Aus diesem Grund werden Daemon-Threads für E / A-Aufgaben nicht empfohlen.

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

3. Verwendung von Daemon-Threads

Daemon-Threads sind nützlich für Hintergrundaufgaben wie die Speicherbereinigung, die Freigabe des Speichers nicht verwendeter Objekte und das Entfernen unerwünschter Einträge aus dem Cache. Die meisten JVM-Threads sind Daemon-Threads.

4. Erstellen eines Daemon-Threads

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

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

Jeder Thread erbt den Daemon-Status des Threads, der ihn erstellt hat. Da der Hauptthread ein Benutzer-Thread ist, ist jeder Thread, der innerhalb der Hauptmethode erstellt wird, standardmäßig ein Benutzer-Thread.

Die Methode setDaemon () kann nur aufgerufen werden, nachdem das Thread- Objekt erstellt und der Thread nicht gestartet wurde. Ein Versuch, setDaemon () aufzurufen, während ein Thread ausgeführt wird, löst eine IllegalThreadStateException 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 Methode isDaemon () 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 Codes auf GitHub verfügbar.