logo

Wątek demona Java

Wątek demona to wątek w tle o niskim priorytecie, który nie zapobiega wyjściu maszyny JVM po zakończeniu wykonywania programu

  • Wątki demona działają w tle, aby obsługiwać wątki użytkownika.
  • JVM kończy działanie automatycznie po zakończeniu wszystkich wątków użytkownika (innych niż demony).
  • Są tworzone przy użyciu tej samej klasy Thread, ale są oznaczane jako demony przy użyciu metody setDaemon(true).
  • Przed uruchomieniem wątku należy wywołać metodę setDaemon(true).
  • Typowe przykłady obejmują moduł zbierający śmieci i wątek finalizatora.

Składnia

Java
thread.setDaemon(true); 

Przypadki użycia

  1. Zbiórka śmieci: Moduł Garbage Collector (GC) w Javie działa jako wątek demona.
  2. Monitorowanie w tle: Wątki demona mogą monitorować stan zasobów lub połączeń komponentów aplikacji.
  3. Usługi rejestrowania i audytu: Wątków demona można używać do ciągłego rejestrowania działań w tle.
  4. Operacje czyszczenia: Wątki demona mogą okresowo czyścić pliki tymczasowe, uwalniając nieużywane zasoby lub przeprowadzając czyszczenie pamięci podręcznej.
  5. Zadania harmonogramu lub timera: Programy planujące działające w tle często używają wątków demonów do wyzwalania zadań w ustalonych odstępach czasu.

Stosowane metody

  • void setDaemon (boolean on): Oznacza wątek jako demona lub wątek użytkownika. Należy wywołać przed start().
  • wartość logiczna isDaemon(): Sprawdza, czy wątek jest demonem.

Tworzenie wątku demona

Java
public class DaemonExample extends Thread {  public void run() {  if (Thread.currentThread().isDaemon()) {  System.out.println('Daemon thread running...');  } else {  System.out.println('User thread running...');  }  }  public static void main(String[] args) {  DaemonExample t1 = new DaemonExample();  DaemonExample t2 = new DaemonExample();  t1.setDaemon(true); // must be set before start()  t1.start();  t2.start();  } } 

Wyjście
Daemon thread running... User thread running... 

Zachowanie wątku demona

Java
public class DaemonBehavior extends Thread {  public void run() {  while (true) {  System.out.println('Daemon thread running...');  }  }  public static void main(String[] args) {  DaemonBehavior t = new DaemonBehavior();  t.setDaemon(true);  t.start();  System.out.println('Main (user) thread ends...');  } } 

Wyjście
Main (user) thread ends... 

JVM kończy się natychmiast po zakończeniu głównego wątku, mimo że wątek demona nadal działa.

Ważne uwagi

  • Wątek dziedziczy status demona wątku, który go utworzył.
  • Metoda setDaemon(true) zgłasza wyjątek IllegalThreadStateException, jeśli zostanie wywołana po uruchomieniu().
  • Wątków demona nie należy używać do zadań wymagających wykonania, takich jak zapisywanie do pliku lub aktualizacja bazy danych.
  • JVM nagle kończy wszystkie wątki demona bez wykonywania operacji czyszczących.

Różnica między wątkiem użytkownika a wątkiem demona

PodstawaWątek użytkownikaWątek Demona
ZamiarWykonuje główne zadania aplikacjiWykonuje usługi w tle
Cykl życiaUtrzymuje JVM przy życiu aż do zakończeniaKończy się po zakończeniu wszystkich wątków użytkownika
PriorytetZwykle wyższyZwykle niższy
Wyjście JVMJVM czeka na zakończenieJVM kończy pracę, nawet jeśli jest uruchomiona
PrzykładyWątki robocze głównego wątkuMonitory tła modułu zbierającego śmieci
Utwórz quiz