Maison  >  Article  >  Java  >  Comment terminer en toute sécurité un thread en Java sans utiliser « stop() » ?

Comment terminer en toute sécurité un thread en Java sans utiliser « stop() » ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-23 19:18:16819parcourir

How to Safely Terminate a Thread in Java Without Using `stop()`?

Comment terminer un fil de discussion sans utiliser stop()

L'utilisation de la méthode stop() pour terminer un fil de discussion peut conduire à un comportement imprévisible. Cet article présente une approche alternative à la terminaison du thread par interruption.

Alternative à stop()

Contrairement à stop(), l'interruption signale au thread de terminer son exécution en douceur. L'interruption est obtenue via la méthode Thread.interrupt(). Lorsqu'un thread est interrompu, il lèvera une InterruptedException.

Exemple d'implémentation

Considérez le code suivant :

public class HelloWorld {

    public static void main(String[] args) throws Exception {
        Thread thread = new Thread(new Runnable() {

            public void run() {
                try {
                    while (!Thread.currentThread().isInterrupted()) {
                        Thread.sleep(5000);
                        System.out.println("Hello World!");
                    }
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            }
        });
        thread.start();
        System.out.println("press enter to quit");
        System.in.read();
        thread.interrupt();
    }
}

Dans cet exemple, le fil est créé et démarré comme d'habitude. Lorsque l'utilisateur appuie sur Entrée, le thread principal interrompt le thread de travail à l'aide de thread.interrupt(). Le thread de travail gère l'interruption en lançant une exception InterruptedException, puis en effaçant l'indicateur d'interruption. Étant donné que le thread vérifie l'interruption dans une boucle, il finira par terminer son exécution après avoir terminé l'itération en cours.

Considérations

  • L'interruption peut provoquer des méthodes telles que sleep() et wait() pour lancer InterruptedException.
  • Il est recommandé de vérifier l'interruption à l'aide de Thread.currentThread().isInterrupted() dans un boucle pour garantir que le thread coopère avec la demande d'interruption.
  • Dans certains cas, il peut être nécessaire de définir l'indicateur d'interruption sur le thread actuel à l'aide de Thread.currentThread().interrupt() dans le bloc catch.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn