Un fir de execuție demon este un fir de execuție cu prioritate scăzută care nu împiedică JVM-ul să iasă atunci când programul termină execuția
- Firele Daemon rulează în fundal pentru a sprijini firele utilizator.
- JVM-ul se iese automat când toate firele de execuție ale utilizatorului (non-daemon) sunt finalizate.
- Acestea sunt create folosind aceeași clasă Thread, dar sunt marcate ca daemon folosind metoda setDaemon(true).
- Metoda setDaemon(true) trebuie apelată înainte de a începe firul.
- Exemplele comune includ Garbage Collector și Finalizer Thread.
Sintaxă
Javathread.setDaemon(true);
Cazuri de utilizare
- Colectarea gunoiului: Garbage Collector (GC) din Java rulează ca un fir de demon.
- Monitorizare de fundal: Firele Daemon pot monitoriza starea resurselor componentelor aplicației sau a conexiunilor.
- Servicii de logare și audit: Firele Daemon pot fi folosite pentru a înregistra continuu activitățile de fundal.
- Operațiuni de curățare: Firele Daemon pot șterge periodic fișierele temporare care eliberează resurse neutilizate sau pot efectua curățarea memoriei cache.
- Activități de programator sau temporizator: Programatorii de fundal folosesc adesea fire daemon pentru a declanșa sarcini la intervale fixe.
Metode utilizate
- void setDaemon(boolean activat): Marchează un fir ca demon sau fir de utilizator. Trebuie apelat înainte de start().
- boolean isDaemon(): Verifică dacă un fir este demon.
Crearea unui thread Daemon
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(); } }
Ieșire
Daemon thread running... User thread running...
Comportamentul Daemon Thread
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...'); } }
Ieșire
Main (user) thread ends...
JVM-ul se termină imediat după ce firul principal se termină, chiar dacă firul daemon încă rulează.
Note importante
- Un fir moștenește starea demonului firului care îl creează.
- Metoda setDaemon(true) aruncă IllegalThreadStateException dacă este apelată după start().
- Firele de execuție Daemon nu ar trebui utilizate pentru sarcini care necesită finalizare, cum ar fi scrierea într-un fișier sau actualizarea unei baze de date.
- JVM termină brusc toate firele de demon fără a efectua operațiuni de curățare.
Diferența dintre firul utilizatorului și firul Daemon
| Bază | Thread utilizator | Daemon Thread |
|---|---|---|
| Scop | Execută sarcinile principale ale aplicației | Efectuează servicii de fundal |
| Ciclu de viață | Păstrează JVM-ul în viață până la terminare | Se termină când toate firele de execuție ale utilizatorului se termină |
| Prioritate | De obicei mai mare | De obicei mai jos |
| Ieșire JVM | JVM așteaptă finalizarea | JVM se iese chiar dacă rulează |
| Exemple | Firele de lucru ale firului principal | Monitoare de fundal pentru colectorul de gunoi |