Existe alguma maneira de obter uma lista de todos os threads em execução na JVM atual (incluindo os threads não iniciados pela minha classe)?
Também é possível obter os objetos Thread
e Class
de todos os threads na lista?
Eu quero ser capaz de fazer isso através do código.
java
multithreading
jvm
Kryten
fonte
fonte
Obtenha um identificador para a raiz
ThreadGroup
, assim:Agora, chame a
enumerate()
função no grupo raiz repetidamente. O segundo argumento permite obter todos os threads, recursivamente:Observe como chamamos enumerate () repetidamente até que a matriz seja grande o suficiente para conter todas as entradas.
fonte
rootGroup
, você deve usarnew Thread[rootGroup.activeCount()+1]
.activeCount()
pode ser zero e, se for, você encontrará um loop infinito.Sim, veja como obter uma lista de threads . Muitos exemplos nessa página.
Isso é feito programaticamente. Se você deseja apenas uma lista no Linux, pelo menos, basta usar este comando:
e a VM fará um despejo de encadeamento para stdout.
fonte
Você pode obter muitas informações sobre threads no ThreadMXBean .
Chame o método estático ManagementFactory.getThreadMXBean () para obter uma referência ao MBean.
fonte
Você já deu uma olhada no jconsole ?
Isso listará todos os threads em execução para um processo Java específico.
Você pode iniciar o jconsole a partir da pasta bin do JDK.
Você também pode obter um rastreamento de pilha completo para todos os threads pressionando
Ctrl+Break
no Windows ou enviandokill pid --QUIT
no Linux.fonte
Os usuários do Apache Commons podem usar
ThreadUtils
. A implementação atual usa a abordagem do grupo de threads, descrita anteriormente.fonte
Você pode tentar algo como isto:
e, obviamente, você pode obter mais características de threads, se precisar.
fonte
No Groovy, você pode chamar métodos privados
Em Java , você pode chamar esse método usando reflexão, desde que o gerenciador de segurança permita.
fonte
Snippet de código para obter a lista de threads iniciada pelo thread principal:
resultado:
Se você precisar de todos os threads, incluindo os do sistema, que não foram iniciados pelo seu programa, remova a condição abaixo.
Agora saída:
fonte
fonte
No console java, pressione Ctrl-Break . Ele listará todos os threads, além de algumas informações sobre o heap. Isso não permitirá o acesso aos objetos, é claro. Mas pode ser muito útil para depuração de qualquer maneira.
fonte
Para obter uma lista de threads e seus estados completos usando o terminal, você pode usar o comando abaixo:
Qual PID é o ID do processo em execução no seu computador. Para obter o ID do processo java, você pode simplesmente executar o
jps
comandoAlém disso, você pode analisar seu dump de encadeamento produzido pelo jstack nos TDAs (Thread Dump Analyzer), como a ferramenta fastthread ou o analisador de encadeamento spotify .
fonte
ManagementFactory.getThreadMXBean().getAllThreadIds()
fonte