Threads de démon en Java

1. Vue d'ensemble

Dans ce court article, nous examinerons les threads de démon en Java et verrons à quoi ils peuvent être utilisés. Nous expliquerons également la différence entre les threads démons et les threads utilisateur.

2. Différence entre les threads démon et utilisateur

Java propose deux types de threads: les threads utilisateur et les threads démons.

Les threads utilisateur sont des threads de haute priorité. La JVM attendra que tout thread utilisateur termine sa tâche avant de la terminer.

D'autre part, les threads démons sont des threads de faible priorité dont le seul rôle est de fournir des services aux threads des utilisateurs.

Étant donné que les threads démons sont destinés à servir les threads utilisateur et ne sont nécessaires que pendant l'exécution des threads utilisateur, ils n'empêcheront pas la JVM de se fermer une fois que tous les threads utilisateur ont terminé leur exécution.

C'est pourquoi les boucles infinies, qui existent généralement dans les threads démons, ne poseront aucun problème, car tout code, y compris les blocs finally , ne sera pas exécuté une fois que tous les threads utilisateur auront terminé leur exécution. Pour cette raison, les threads de démon ne sont pas recommandés pour les tâches d'E / S.

Cependant, il existe des exceptions à cette règle. Un code mal conçu dans les threads de démon peut empêcher la JVM de se fermer. Par exemple, appeler Thread.join () sur un thread démon en cours d'exécution peut bloquer l'arrêt de l'application.

3. Utilisations des threads de démon

Les threads de démon sont utiles pour les tâches de prise en charge en arrière-plan telles que le garbage collection, la libération de la mémoire des objets inutilisés et la suppression des entrées indésirables du cache. La plupart des threads JVM sont des threads démons.

4. Création d'un thread démon

Pour définir un thread comme un thread démon, tout ce que nous devons faire est d'appeler Thread.setDaemon (). Dans cet exemple, nous utiliserons la classe NewThread qui étend la classe Thread :

NewThread daemonThread = new NewThread(); daemonThread.setDaemon(true); daemonThread.start();

Tout thread hérite du statut de démon du thread qui l'a créé. Étant donné que le thread principal est un thread utilisateur, tout thread créé à l'intérieur de la méthode main est par défaut un thread utilisateur.

La méthode setDaemon () ne peut être appelée qu'après que l' objet Thread a été créé et que le thread n'a pas été démarré. Une tentative d'appeler setDaemon () alors qu'un thread est en cours d'exécution lèvera une IllegalThreadStateException :

@Test(expected = IllegalThreadStateException.class) public void whenSetDaemonWhileRunning_thenIllegalThreadStateException() { NewThread daemonThread = new NewThread(); daemonThread.start(); daemonThread.setDaemon(true); }

5. Vérifier si un thread est un thread démon

Enfin, pour vérifier si un thread est un thread démon, nous pouvons simplement appeler la méthode isDaemon () :

@Test public void whenCallIsDaemon_thenCorrect() { NewThread daemonThread = new NewThread(); NewThread userThread = new NewThread(); daemonThread.setDaemon(true); daemonThread.start(); userThread.start(); assertTrue(daemonThread.isDaemon()); assertFalse(userThread.isDaemon()); }

6. Conclusion

Dans ce rapide didacticiel, nous avons vu ce que sont les threads démons et à quoi ils peuvent être utilisés dans quelques scénarios pratiques.

Comme toujours, la version complète du code est disponible à l'adresse over sur GitHub.