Comment pouvez-vous tuer un thread en Java ?
Réponses
Trop de publicités?Voir ce fil par le Soleil sur pourquoi ils obsolète Fil.stop(). Il va dans le détail pourquoi c'est une mauvaise méthode et ce qui doit être fait pour arrêter les threads en général.
http://docs.oracle.com/javase/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html
La façon dont ils les recommande est d'utiliser une variable partagée comme un drapeau qui demande le thread d'arrière-plan pour l'arrêter. Cette variable peut être défini par un autre objet qui demande le fil fin.
En général vous n’avez pas...
Vous lui demandez d’interrompre tout ce qu’il fait à l’aide de Thread.interrupt() (lien de javadoc)
Une bonne explication de pourquoi est javadoc ici (lien de la note technique java)
Dans les threads Java ne sont pas tués, mais l'arrêt d'un thread est fait dans un esprit de coopération. Le fil est invité à se terminer et le fil peut alors l'arrêt en douceur.
Souvent un volatile boolean
champ est utilisé qui le thread vérifie périodiquement et s'arrête lorsqu'il est réglé à la valeur correspondante.
Je ne voudrais pas utiliser un boolean
afin de vérifier si le fil devrait mettre fin. Si vous utilisez volatile
comme un modificateur de champ, ce sera un travail fiable, mais si votre code devient de plus en plus complexe, au contraire, utilise d'autres méthodes de blocage à l'intérieur de l' while
de la boucle, il peut se produire que votre code ne va pas mettre fin à tout ou au moins prend plus de temps que vous pourriez vouloir.
Certains de blocage de la bibliothèque de support de méthodes d'interruption.
Chaque thread a déjà un indicateur booléen état d'interruption et vous devriez faire usage de il. Il peut être mis en œuvre comme ceci:
public void run() {
try {
while(!Thread.currentThread().isInterrupted()) {
// ...
}
} catch (InterruptedException consumed)
/* Allow thread to exit */
}
}
public void cancel() { interrupt(); }
Le code Source de prises de Java de la Simultanéité dans la Pratique. Depuis l' cancel()
méthode est publique, vous pouvez laisser un autre thread appeler cette méthode comme vous le vouliez.
Il y a aussi un mal nommée méthode statique interrupted
qui efface l'état d'interruption du thread courant.
Il y a une façon dont vous pouvez le faire. Mais si vous aviez à l’utiliser, soit vous êtes un mauvais programmeur ou vous utilisez un code écrit par les programmeurs mauvais. Alors, vous devriez penser à arrêter étant un mauvais programmeur ou arrêt à l’aide de ce code mauvais. Cette solution n’est uniquement pour des situations quand il n’y a aucun autre moyen.