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
Javathread.setDaemon(true);
Gebruiksscenario's
- Afvalinzameling: De Garbage Collector (GC) in Java draait als een daemon-thread.
- Achtergrondmonitoring: Daemon-threads kunnen de status van bronnen of verbindingen van applicatiecomponenten bewaken.
- Logboek- en auditdiensten: Daemon-threads kunnen worden gebruikt om achtergrondactiviteiten continu te registreren.
- Opruimoperaties: Daemon-threads kunnen periodiek tijdelijke bestanden wissen, ongebruikte bronnen vrijgeven of cache-opschoning uitvoeren.
- 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
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(); } }
Uitvoer
Daemon thread running... User thread running...
Gedrag van 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...'); } }
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
| Basis | Gebruikersthread | Daemon-draad |
|---|---|---|
| Doel | Voert de belangrijkste applicatietaken uit | Voert achtergronddiensten uit |
| Levenscyclus | Houdt JVM in leven totdat het klaar is | Beëindigt wanneer alle gebruikersthreads zijn voltooid |
| Prioriteit | Meestal hoger | Meestal lager |
| JVM-uitgang | JVM wacht op voltooiing | JVM wordt afgesloten, zelfs als deze actief is |
| Voorbeelden | Hoofdthread-werkstersthreads | Achtergrondmonitors voor vuilnismannen |