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
Javathread.setDaemon(true);
Przypadki użycia
- Zbiórka śmieci: Moduł Garbage Collector (GC) w Javie działa jako wątek demona.
- Monitorowanie w tle: Wątki demona mogą monitorować stan zasobów lub połączeń komponentów aplikacji.
- Usługi rejestrowania i audytu: Wątków demona można używać do ciągłego rejestrowania działań w tle.
- Operacje czyszczenia: Wątki demona mogą okresowo czyścić pliki tymczasowe, uwalniając nieużywane zasoby lub przeprowadzając czyszczenie pamięci podręcznej.
- 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
Javapublic 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
Javapublic 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
| Podstawa | Wątek użytkownika | Wątek Demona |
|---|---|---|
| Zamiar | Wykonuje główne zadania aplikacji | Wykonuje usługi w tle |
| Cykl życia | Utrzymuje JVM przy życiu aż do zakończenia | Kończy się po zakończeniu wszystkich wątków użytkownika |
| Priorytet | Zwykle wyższy | Zwykle niższy |
| Wyjście JVM | JVM czeka na zakończenie | JVM kończy pracę, nawet jeśli jest uruchomiona |
| Przykłady | Wątki robocze głównego wątku | Monitory tła modułu zbierającego śmieci |