245 votes

Obtenir une liste de tous les Threads en cours d'exécution en Java

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 lancé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 par code.

349voto

thejoshwolfe Points 1790

Pour obtenir un ensemble itérable :

Set<Thread> threadSet = Thread.getAllStackTraces().keySet();

Pour le convertir en tableau :

Thread[] threadArray = threadSet.toArray(new Thread[threadSet.size()]);

84voto

Frerich Raabe Points 23711

Obtenez un identifiant pour le ThreadGroup racine, comme ceci :

ThreadGroup rootGroup = Thread.currentThread( ).getThreadGroup( );
ThreadGroup parentGroup;
while ( ( parentGroup = rootGroup.getParent() ) != null ) {
    rootGroup = parentGroup;
}

Maintenant, appelez la fonction enumerate() sur le groupe Root de façon répétée. Le deuxième argument vous permet d'obtenir tous les fils, de manière récursive :

Thread[] threads = new Thread[ rootGroup.activeCount() ];
while ( rootGroup.enumerate( threads, true ) == threads.length ) {
    threads = new Thread[ threads.length * 2 ];
}

Notez comment nous appelons enumerate() de manière répétée jusqu'à ce que le tableau soit assez grand pour contenir toutes les entrées.

29voto

cletus Points 276888

Oui, jetez un coup d'œil à obtenir une liste de fils . Beaucoup d'exemples sur cette page.

C'est pour le faire de manière programmatique. Si vous voulez juste une liste sous Linux, vous pouvez au moins utiliser cette commande :

kill -3 processid

et la VM fera un vidage de thread sur stdout.

18voto

Dan Dyer Points 30082

Vous pouvez obtenir beaucoup d'informations sur les fils de discussion à partir de l'onglet ThreadMXBean .

Appelez le service statique ManagementFactory.getThreadMXBean() pour obtenir une référence au MBean.

15voto

pjp Points 7012

Avez-vous jeté un coup d'œil à jconsole ?

Cette option permet de lister tous les threads en cours d'exécution pour un processus Java particulier.

Vous pouvez lancer jconsole à partir du dossier bin du JDK.

Vous pouvez également obtenir une trace complète de la pile pour tous les threads en appuyant sur Ctrl+Break dans Windows ou en envoyant kill pid --QUIT dans Linux.

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