Fils de démon en Java

Fils de démon en Java

1. Vue d'ensemble

Dans ce court article, nous allons examiner les threads de démon en Java et voir à 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émon.

Les threads utilisateur sont des threads de haute priorité. The JVM will wait for any user thread to complete its task before terminating it.

D'autre part,daemon threads are low-priority threads whose only role is to provide services to user threads.

É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 aucun code, y compris les blocsfinally, ne sera exécuté une fois que tous les threads utilisateur auront terminé leur exécution. Pour cette raison,daemon threads are not recommended for I/O tasks.

Cependant, il existe des exceptions à cette règle. Un code mal conçu dans les threads de démon peut empêcher la machine virtuelle Java de quitter. Par exemple, l'appel deThread.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 Daemon sont utiles pour les tâches de support en arrière-plan telles que la récupération de place, la libération de la mémoire des objets inutilisés et la suppression des entrées non souhaitées du cache. La plupart des threads JVM sont des threads démon.

4. Créer un thread démon

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

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

Any thread inherits the daemon status of the thread that created it. Puisque 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éthodesetDaemon() ne peut être appelée qu'après que l'objetThread a été créé et que le thread n'a pas été démarré. Une tentative d'appelersetDaemon() alors qu'un thread est en cours d'exécution lancera unIllegalThreadStateException:

@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éthodeisDaemon():

@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 tutoriel, 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 disponibleover on GitHub.