8
votes

Comment tuer des fils de morsed dans Java?

J'aimerais tuer des threads qui sont bloqués dans l'état de l'impasse. Tout d'abord, nous pouvons Détecter les identifiants de thread dans l'état deadlock à l'aide du FindDockedThreads () Méthode de la catégorie threadmxbean dans java.lang.management .

Alors, je voudrais tuer les threads par des identifiants de thread et j'ai donc deux questions connexes:
(1) Comment obtenir le contrôle d'un thread par un identifiant de thread?
(2) Comment tuer un fil bloqué? Je pense que la méthode d'invoquant interruption () donnera une exception au fil et tuera le fil.


4 commentaires

Fixer le code de sorte que les threads ne manquent pas d'une impasse en premier lieu devraient être ce que vous essayez de faire.


Comme Chris a dit, je pense que vous devriez concevoir un plan pour éviter toute impasse.


Le seul moyen raisonnablement sûr de faire ce que vous voulez est System.exit () ... et je ne plaisante que partiellement.


Oui, détecter et corriger une impasse est la première option, si j'écris un programme simultané. Mais je prévois d'écrire un détecteur d'impasse en vérifiant les threads de l'utilisateur au moment de l'exécution. :)


3 Réponses :


3
votes

du groupe thread thread, vous pouvez avoir la classe de threads énumérer tous les threads d'exécution . Ensuite, vous pouvez appeler thread.stop sur celui qui correspond à votre identifiant.

Cela dit, cela est très dangereux en raison du potentiel de laisser des objets dans un état incohérent. Je ne crois pas que la méthode d'interruption entraînera une libération de fil qui est bloquée dans l'attente d'un verrou de synchronisation, de sorte que les méthodes d'arrêt (mal)

Voir aussi: " Déprécation primitive de java < / a> ".


3 commentaires

La méchanceté de cela ne peut pas être suffisamment soulignée. Mieux vaut écrire le code pour éviter l'impasse en premier lieu.


Enumérant tous les threads en cours d'exécution est un article intéressant, donc je l'utiliserai certainement plus tard. Merci.


L'approche thread.stop () ne semble pas fonctionner dans Java 1.5. Les fils sans morceaux restent dans l'état bloqué. Pour moi, j'essaie d'écrire un test d'unité pour un détecteur d'impasse et je ne peux pas me débarrasser de mes fils de sauts intentionnels! :-)



6
votes

La méthode java.util.concurrent.lock.lock.lockinterruptimiblement () est interruptible, le verrouillage synchronisé beaucoup plus courant n'est pas. Comme mentionné dans la documentation, la possibilité d'énumérer des threads deadhocked est conçue comme une aide de débogage et non comme un moyen de récupérer dans un environnement de production.

en production, il est probablement plus sûr de sortir de l'ensemble du processus et de redémarrer.


0 commentaires