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 Alors, je voudrais tuer les threads par des identifiants de thread et j'ai donc deux questions connexes: FindDockedThreads () code> Méthode de la catégorie code> threadmxbean code> dans
java.lang.management code>. p>
(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. P>
3 Réponses :
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. P>
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) p>
Voir aussi: " Déprécation primitive de java < / a> ". p>
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! :-)
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. P>
en production, il est probablement plus sûr de sortir de l'ensemble du processus et de redémarrer. P>
même thread.stop () est incapable d'arrêter le fil sur une impasse sur une liaison intrinsèque. Si un thread est bloqué en attente d'un verrou intrinsèque, vous ne pouvez rien faire pour empêcher cela de vous assurer que cela acquiert finalement la serrure et fait suffisamment de progrès que vous pouvez attirer son attention sur une autre manière. a> Ça fonctionne avec serrure.lock () à travers. p>
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. :)