423 votes

Comment pouvez-vous tuer un thread en Java ?

Comment pouvez-vous tuer un thread en Java ?

207voto

JaredPar Points 333733

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.

133voto

Fredrik Points 4195

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)

67voto

platzhirsch Points 10662

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.

22voto

karim79 Points 178055

Une façon est de définir une variable de classe et l’utiliser comme une sentinelle.

Définir une variable de classe externe, c'est-à-dire drapeau = true dans l’exemple ci-dessus. Réglez-le sur false pour « tuer » le thread.

12voto

VadimPlatonov Points 13

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X