Existe-t-il un moyen d'obtenir une liste de tous les threads en cours d'exécution dans la JVM actuelle (y compris les threads non démarrés par ma classe)?
Est-il également possible d'obtenir les objets Thread
et Class
de tous les threads de la liste?
Je veux pouvoir le faire via du code.
java
multithreading
jvm
Kryten
la source
la source
Obtenez une poignée à la racine
ThreadGroup
, comme ceci:Maintenant, appelez la
enumerate()
fonction sur le groupe racine à plusieurs reprises. Le deuxième argument vous permet d'obtenir tous les threads, récursivement:Notez comment nous appelons enumerate () jusqu'à ce que le tableau soit suffisamment grand pour contenir toutes les entrées.
la source
rootGroup
, vous devez utilisernew Thread[rootGroup.activeCount()+1]
.activeCount()
pourrait être nul, et si c'est le cas, vous courrez dans une boucle infinie.Oui, jetez un œil à l' obtention d'une liste de threads . Beaucoup d'exemples sur cette page.
C'est pour le faire par programme. Si vous voulez juste une liste sur Linux au moins, vous pouvez simplement utiliser cette commande:
et la VM fera un vidage des threads vers stdout.
la source
Vous pouvez obtenir beaucoup d'informations sur les threads à partir de ThreadMXBean .
Appelez la méthode statique ManagementFactory.getThreadMXBean () pour obtenir une référence au MBean.
la source
Avez-vous jeté un œil à jconsole ?
Cela répertoriera tous les threads en cours d'exécution pour un processus Java particulier.
Vous pouvez démarrer jconsole à partir du dossier bin JDK.
Vous pouvez également obtenir une trace de pile complète pour tous les threads en appuyant
Ctrl+Break
sur Windows ou en envoyantkill pid --QUIT
sous Linux.la source
Les utilisateurs d'Apache Commons peuvent utiliser
ThreadUtils
. L'implémentation actuelle utilise l'approche Walk the Thread Group décrite précédemment.la source
Vous pouvez essayer quelque chose comme ceci:
et vous pouvez évidemment obtenir plus de caractéristiques de fil si vous en avez besoin.
la source
Dans Groovy, vous pouvez appeler des méthodes privées
En Java , vous pouvez invoquer cette méthode en utilisant la réflexion à condition que le gestionnaire de sécurité le permette.
la source
Extrait de code pour obtenir la liste des threads démarrés par le thread principal:
production:
Si vous avez besoin de tous les threads, y compris les threads système, qui n'ont pas été démarrés par votre programme, supprimez la condition ci-dessous.
Maintenant sortie:
la source
la source
Dans la console java, appuyez sur Ctrl-Break . Il répertorie tous les threads ainsi que quelques informations sur le tas. Cela ne vous donnera pas accès aux objets bien sûr. Mais cela peut être très utile pour le débogage de toute façon.
la source
Pour obtenir une liste des threads et leurs états complets à l'aide du terminal, vous pouvez utiliser la commande ci-dessous:
Quel PID est l'ID du processus en cours d'exécution sur votre ordinateur. Pour obtenir l'ID de processus de votre processus java, vous pouvez simplement exécuter la
jps
commande.En outre, vous pouvez analyser votre vidage de threads produit par jstack dans TDAs (Thread Dump Analyzer) tel un outil d'analyse de threads rapide ou spotify .
la source
ManagementFactory.getThreadMXBean().getAllThreadIds()
la source