Un fil de dimoni és un fil de fons de baixa prioritat que no impedeix que la JVM surti quan el programa s'acaba d'executar
- Els fils del dimoni s'executen en segon pla per donar suport als fils d'usuari.
- La JVM surt automàticament quan es completen tots els fils d'usuari (que no siguin dimonis).
- Es creen amb la mateixa classe Thread, però es marquen com a dimoni mitjançant el mètode setDaemon(true).
- El mètode setDaemon(true) s'ha de cridar abans que comenci el fil.
- Els exemples habituals inclouen Garbage Collector i Finalizer Thread.
Sintaxi
Javathread.setDaemon(true);
Casos d'ús
- Recollida d'escombraries: El Garbage Collector (GC) a Java s'executa com a fil de dimoni.
- Supervisió de fons: Els fils de dimoni poden supervisar l'estat dels recursos o connexions dels components de l'aplicació.
- Serveis de registre i auditoria: Els fils de dimoni es poden utilitzar per registrar activitats en segon pla de manera contínua.
- Operacions de neteja: Els fils del dimoni poden esborrar periòdicament els fitxers temporals que alliberin recursos no utilitzats o realitzar una neteja de memòria cau.
- Tasques del programador o del temporitzador: Els programadors de fons sovint utilitzen fils de dimoni per activar tasques a intervals fixos.
Mètodes emprats
- void setDaemon (booleà activat): Marca un fil com a dimoni o fil d'usuari. S'ha de cridar abans de start().
- booleà isDaemon(): Comprova si un fil és un dimoni.
Creació d'un fil de dimoni
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(); } }
Sortida
Daemon thread running... User thread running...
Comportament de 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...'); } }
Sortida
Main (user) thread ends...
La JVM acaba immediatament després que s'hagi acabat el fil principal tot i que el fil del dimoni encara s'està executant.
Notes importants
- Un fil hereta l'estat del dimoni del fil que el crea.
- El mètode setDaemon(true) llança IllegalThreadStateException si es crida després de start().
- Els fils de dimoni no s'han d'utilitzar per a tasques que requereixen la realització, com ara escriure en un fitxer o actualitzar una base de dades.
- JVM finalitza tots els fils del dimoni de forma brusca sense realitzar operacions de neteja.
Diferència entre el fil d'usuari i el fil del dimoni
| Base | Fil d'usuari | Fil del dimoni |
|---|---|---|
| Propòsit | Executa les tasques principals de l'aplicació | Realitza serveis de fons |
| Cicle de vida | Manté viva la JVM fins que s'acabi | S'acaba quan acaben tots els fils d'usuari |
| Prioritat | Normalment més alt | Normalment més baix |
| Sortida de JVM | JVM espera que finalitzi | JVM surt encara que estigui en execució |
| Exemples | Fils de treball del fil principal | Monitors de fons del col·lector d'escombraries |