logo

Java Daemon-thread

Een daemonthread is een achtergrondthread met lage prioriteit die niet verhindert dat de JVM wordt afgesloten wanneer de uitvoering van het programma is voltooid

  • Daemon-threads worden op de achtergrond uitgevoerd om gebruikersthreads te ondersteunen.
  • De JVM wordt automatisch afgesloten wanneer alle gebruikersthreads (niet-daemon) zijn voltooid.
  • Ze zijn gemaakt met dezelfde Thread-klasse, maar zijn gemarkeerd als daemon met behulp van de setDaemon(true) -methode.
  • De methode setDaemon(true) moet worden aangeroepen voordat de thread start.
  • Veel voorkomende voorbeelden zijn Garbage Collector en Finalizer Thread.

Syntaxis

Java
thread.setDaemon(true); 

Gebruiksscenario's

  1. Afvalinzameling: De Garbage Collector (GC) in Java draait als een daemon-thread.
  2. Achtergrondmonitoring: Daemon-threads kunnen de status van bronnen of verbindingen van applicatiecomponenten bewaken.
  3. Logboek- en auditdiensten: Daemon-threads kunnen worden gebruikt om achtergrondactiviteiten continu te registreren.
  4. Opruimoperaties: Daemon-threads kunnen periodiek tijdelijke bestanden wissen, ongebruikte bronnen vrijgeven of cache-opschoning uitvoeren.
  5. Planner- of timertaken: Achtergrondplanners gebruiken vaak daemonthreads om taken met vaste intervallen te activeren.

Gebruikte methoden

  • void setDaemon(boolean aan): Markeert een thread als daemon of gebruikersthread. Moet vóór start() worden aangeroepen.
  • boolean isDaemon(): Controleert of een thread een daemon is.

Een Daemon-thread maken

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

Uitvoer
Daemon thread running... User thread running... 

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

Uitvoer
Main (user) thread ends... 

De JVM eindigt onmiddellijk nadat de hoofdthread is voltooid, ook al loopt de daemon-thread nog steeds.

Belangrijke opmerkingen

  • Een thread neemt de daemonstatus over van de thread die deze maakt.
  • De methode setDaemon(true) genereert IllegalThreadStateException als deze wordt aangeroepen na start().
  • Daemon-threads mogen niet worden gebruikt voor taken die voltooiing vereisen, zoals het schrijven naar een bestand of het bijwerken van een database.
  • JVM beëindigt alle daemon-threads abrupt zonder opschoonbewerkingen uit te voeren.

Verschil tussen gebruikersthread en Daemon-thread

BasisGebruikersthreadDaemon-draad
DoelVoert de belangrijkste applicatietaken uitVoert achtergronddiensten uit
LevenscyclusHoudt JVM in leven totdat het klaar isBeëindigt wanneer alle gebruikersthreads zijn voltooid
PrioriteitMeestal hogerMeestal lager
JVM-uitgangJVM wacht op voltooiingJVM wordt afgesloten, zelfs als deze actief is
VoorbeeldenHoofdthread-werkstersthreadsAchtergrondmonitors voor vuilnismannen
Quiz maken