Un thread démon est un thread d'arrière-plan de faible priorité qui n'empêche pas la JVM de se fermer une fois l'exécution du programme terminée.
- Les threads démons s'exécutent en arrière-plan pour prendre en charge les threads utilisateur.
- La JVM se ferme automatiquement lorsque tous les threads utilisateur (non démons) sont terminés.
- Ils sont créés à l'aide de la même classe Thread mais sont marqués comme démon à l'aide de la méthode setDaemon(true).
- La méthode setDaemon(true) doit être appelée avant le démarrage du thread.
- Les exemples courants incluent Garbage Collector et Finalizer Thread.
Syntaxe
Javathread.setDaemon(true);
Cas d'utilisation
- Collecte des déchets : Le Garbage Collector (GC) en Java s'exécute comme un thread démon.
- Surveillance en arrière-plan : Les threads démons peuvent surveiller l’état des ressources ou des connexions des composants d’application.
- Services de journalisation et d'audit : Les threads démons peuvent être utilisés pour enregistrer les activités en arrière-plan en continu.
- Opérations de nettoyage : Les threads démons peuvent périodiquement effacer les fichiers temporaires, libérer les ressources inutilisées ou effectuer un nettoyage du cache.
- Tâches du planificateur ou du minuteur : Les planificateurs en arrière-plan utilisent souvent des threads démons pour déclencher des tâches à intervalles fixes.
Méthodes utilisées
- void setDaemon (booléen sur): Marque un thread comme démon ou thread utilisateur. Doit être appelé avant start().
- booléen isDaemon() : Vérifie si un thread est un démon.
Création d'un fil de discussion démon
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(); } }
Sortir
Daemon thread running... User thread running...
Comportement du fil démon
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...'); } }
Sortir
Main (user) thread ends...
La JVM se termine immédiatement après la fin du thread principal, même si le thread démon est toujours en cours d'exécution.
Remarques importantes
- Un thread hérite du statut de démon du thread qui le crée.
- La méthode setDaemon(true) lève IllegalThreadStateException si elle est appelée après start().
- Les threads démon ne doivent pas être utilisés pour des tâches nécessitant une exécution telles que l'écriture dans un fichier ou la mise à jour d'une base de données.
- JVM met fin brusquement à tous les threads démons sans effectuer d'opérations de nettoyage.
Différence entre le thread utilisateur et le thread démon
| Base | Sujet d'utilisateur | Fil de démon |
|---|---|---|
| But | Exécute les principales tâches de l'application | Effectue des services d’arrière-plan |
| Cycle de vie | Maintient la JVM en vie jusqu'à la fin | Se termine lorsque tous les threads utilisateur sont terminés |
| Priorité | Généralement plus élevé | Généralement inférieur |
| Sortie de la JVM | JVM attend la fin | La JVM se ferme même si elle est en cours d'exécution |
| Exemples | Threads de travail du thread principal | Moniteurs d'arrière-plan pour collecteur de déchets |