logo

Fil de dimoni de Java

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

Java
thread.setDaemon(true); 

Casos d'ús

  1. Recollida d'escombraries: El Garbage Collector (GC) a Java s'executa com a fil de dimoni.
  2. Supervisió de fons: Els fils de dimoni poden supervisar l'estat dels recursos o connexions dels components de l'aplicació.
  3. Serveis de registre i auditoria: Els fils de dimoni es poden utilitzar per registrar activitats en segon pla de manera contínua.
  4. 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.
  5. 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

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();  } } 

Sortida
Daemon thread running... User thread running... 

Comportament de Daemon Thread

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...');  } } 

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

BaseFil d'usuariFil del dimoni
PropòsitExecuta les tasques principals de l'aplicacióRealitza serveis de fons
Cicle de vidaManté viva la JVM fins que s'acabiS'acaba quan acaben tots els fils d'usuari
PrioritatNormalment més altNormalment més baix
Sortida de JVMJVM espera que finalitziJVM surt encara que estigui en execució
ExemplesFils de treball del fil principalMonitors de fons del col·lector d'escombraries
Crea un qüestionari