logo

Java Daemon Thread

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ă

Java
thread.setDaemon(true); 

Cazuri de utilizare

  1. Colectarea gunoiului: Garbage Collector (GC) din Java rulează ca un fir de demon.
  2. Monitorizare de fundal: Firele Daemon pot monitoriza starea resurselor componentelor aplicației sau a conexiunilor.
  3. Servicii de logare și audit: Firele Daemon pot fi folosite pentru a înregistra continuu activitățile de fundal.
  4. Operațiuni de curățare: Firele Daemon pot șterge periodic fișierele temporare care eliberează resurse neutilizate sau pot efectua curățarea memoriei cache.
  5. 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

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

Ieșire
Daemon thread running... User thread running... 

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

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 utilizatorDaemon Thread
ScopExecută sarcinile principale ale aplicațieiEfectuează servicii de fundal
Ciclu de viațăPăstrează JVM-ul în viață până la terminareSe termină când toate firele de execuție ale utilizatorului se termină
PrioritateDe obicei mai mareDe obicei mai jos
Ieșire JVMJVM așteaptă finalizareaJVM se iese chiar dacă rulează
ExempleFirele de lucru ale firului principalMonitoare de fundal pentru colectorul de gunoi
Creați un test