7
votes

Comment arrêter un fil par un autre fil?

J'ai des difficultés avec des fils en Java, j'ai trois threads - fil1, fil2 et fil3. Celles-ci font une tâche quand il a commencé, je veux arrêter ces deux threads par Thread1. J'ai mis Filg1 pour Sleep (500) , puis j'arrête les deux threads, mais le processus de deux threads est toujours en marche. Avez-vous une idée de comment faire cela?


1 commentaires

Obtenu un certain code comme exemple ??


3 Réponses :


3
votes

Vous pouvez soit:

  • avoir un drapeau booléen que les fils vérifient régulièrement. S'il est modifié, alors, ils arrêtent d'exécuter (note que cela peut provoquer des conditions de course)
  • Une autre option serait d'utiliser le < Code> exécutantservice :

    Un exécuteur exécutif qui fournit des méthodes pour gérer la résiliation et les méthodes qui peut produire un avenir pour suivre le progrès d'un ou plusieurs Tâches asynchrones.


1 commentaires

Les conditions initiales sont également importantes. Tous les filets doivent commencer à sourdine.



9
votes

Vous ne pouvez pas arrêter un fil d'un autre fil. Vous ne pouvez demander que le fil s'arrête et la meilleure façon de le faire est de l'interrompre. Le thread interrompu doit cependant collaborer et répondre à l'interruption dès que possible en arrêtant son exécution.

Ceci est couvert dans le didacticiel Java sur la concurrence .


1 commentaires

Est-ce que "un fil ne peut pas arrêter un autre fil" (dans le même processus) une idée générale non seulement pour Java? Est-ce parce que seule l'interruption entre les processus a une signification?



21
votes

Comment essayez-vous de les arrêter? thread.stop ? Soyez averti que cette méthode est obsolète.

Au lieu de cela, recherchez une sorte d'indicateur pour le fil 1 pour communiquer pour enfiler 2 et 3 qu'ils devraient arrêter. En fait, vous pouvez probablement utiliser interruption .

ci-dessous, fil.Interrupt est utilisé pour implémenter le Coordination. xxx


Vous pouvez également utiliser un volatile booléen (ou Atomicboolant ) en tant que moyen de communication. Accès atomique fourni par volatile et Java. util.concurrent.atomic. * vous permet de vous assurer que la mutation du drapeau est vue par les threads de sujet. xxx

De même, vous pouvez choisir, plutôt que Utilisez atomicboolcan , utilisez un champ tel que: xxx


mieux encore, si vous tirez parti de executetorservice s, vous pouvez également programmer un code similaire comme suit: xxx

Cela profite du fait que threadpoolexecutor.shutdownNow interrompt ses fils de travailleur dans une tentative de fermeture du signal.


en cours d'exécution, la sortie doit être quelque chose à l'effet de: xxx

note que les deux dernières lignes peuvent venir dans ei la commande.


0 commentaires