Vlákno démona je vlákno na pozadí s nízkou prioritou, které nebrání JVM v ukončení, když program dokončí provádění.
- Vlákna démonů běží na pozadí a podporují uživatelská vlákna.
- JVM se automaticky ukončí po dokončení všech uživatelských (jiných než démonů) vláken.
- Jsou vytvořeny pomocí stejné třídy Thread, ale jsou označeny jako démon pomocí metody setDaemon(true).
- Před spuštěním vlákna musí být zavolána metoda setDaemon(true).
- Mezi běžné příklady patří Garbage Collector a Finalizer Thread.
Syntax
Javathread.setDaemon(true);
Případy použití
- Odvoz odpadu: Garbage Collector (GC) v Javě běží jako vlákno démona.
- Sledování na pozadí: Vlákna démonů mohou monitorovat stav prostředků nebo připojení komponent aplikace.
- Logovací a auditorské služby: Vlákna démonů lze použít k průběžnému protokolování aktivit na pozadí.
- Úklidové operace: Vlákna démonů mohou pravidelně čistit dočasné soubory, uvolňovat nepoužívané prostředky nebo provádět čištění mezipaměti.
- Úlohy plánovače nebo časovače: Plánovače na pozadí často používají vlákna démona ke spouštění úloh v pevných intervalech.
Použité metody
- void setDaemon (logická hodnota zapnuta): Označí vlákno jako démon nebo uživatelské vlákno. Musí být voláno před start().
- boolean isDaemon(): Zkontroluje, zda je vlákno démonem.
Vytvoření démonového vlákna
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(); } }
Výstup
Daemon thread running... User thread running...
Chování démonického vlákna
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...'); } }
Výstup
Main (user) thread ends...
JVM skončí okamžitě po dokončení hlavního vlákna, i když vlákno démona stále běží.
Důležité poznámky
- Vlákno zdědí stav démona vlákna, které jej vytváří.
- Metoda setDaemon(true) vyvolá výjimku IllegalThreadStateException, pokud je zavolána po start().
- Vlákna démonů by se neměla používat pro úlohy vyžadující dokončení, jako je zápis do souboru nebo aktualizace databáze.
- JVM náhle ukončí všechna vlákna démona bez provedení operací čištění.
Rozdíl mezi uživatelským vláknem a démonovým vláknem
| Základ | Uživatelské vlákno | Démonské vlákno |
|---|---|---|
| Účel | Provádí hlavní aplikační úlohy | Provádí služby na pozadí |
| Životní cyklus | Udržuje JVM naživu až do dokončení | Ukončí se, když skončí všechna uživatelská vlákna |
| Přednost | Obvykle vyšší | Obvykle nižší |
| Konec JVM | JVM čeká na dokončení | JVM se ukončí, i když běží |
| Příklady | Pracovní vlákna hlavního vlákna | Garbage collector pozadí monitory |