¿Hay alguna manera de obtener una lista de todos los hilos en ejecución en la JVM actual (incluidos los hilos no iniciados por mi clase)?
¿También es posible obtener los objetos Thread
y Class
de todos los hilos en la lista?
Quiero poder hacer esto a través del código.
java
multithreading
jvm
Kryten
fuente
fuente
Obtenga un identificador para la raíz
ThreadGroup
, así:Ahora, llame a la
enumerate()
función en el grupo raíz repetidamente. El segundo argumento le permite obtener todos los hilos, de forma recursiva:Observe cómo llamamos a enumerate () repetidamente hasta que la matriz sea lo suficientemente grande como para contener todas las entradas.
fuente
rootGroup
, debe usarnew Thread[rootGroup.activeCount()+1]
.activeCount()
podría ser cero, y si lo es, te encontrarás con un bucle infinito.Sí, eche un vistazo para obtener una lista de hilos . Muchos ejemplos en esa página.
Eso es hacerlo programáticamente. Si solo desea una lista en Linux, al menos puede usar este comando:
y la VM hará un volcado de subprocesos a stdout.
fuente
Puede obtener mucha información sobre subprocesos de ThreadMXBean .
Llame al método estático ManagementFactory.getThreadMXBean () para obtener una referencia al MBean.
fuente
¿Has echado un vistazo a jconsole ?
Esto enumerará todos los hilos que se ejecutan para un proceso Java en particular.
Puede iniciar jconsole desde la carpeta bin JDK.
También puede obtener un seguimiento completo de la pila para todos los hilos presionando
Ctrl+Break
en Windows o enviandokill pid --QUIT
en Linux.fuente
Los usuarios de Apache Commons pueden usar
ThreadUtils
. La implementación actual utiliza el enfoque de caminar por el grupo de subprocesos descrito anteriormente.fuente
Puedes probar algo como esto:
y obviamente puede obtener más características de hilo si lo necesita.
fuente
En Groovy puedes llamar a métodos privados
En Java , puede invocar ese método utilizando la reflexión siempre que el administrador de seguridad lo permita.
fuente
Fragmento de código para obtener una lista de hilos iniciados por el hilo principal:
salida:
Si necesita todos los hilos, incluidos los hilos del sistema, que su programa no ha iniciado, elimine la siguiente condición.
Ahora salida:
fuente
fuente
En la consola de Java, presiona Ctrl-Break . Enumerará todos los subprocesos más información sobre el montón. Esto no le dará acceso a los objetos, por supuesto. Pero puede ser muy útil para la depuración de todos modos.
fuente
Para obtener una lista de subprocesos y sus estados completos utilizando el terminal, puede usar el siguiente comando:
Qué PID es la identificación del proceso que se ejecuta en su computadora. Para obtener la identificación del proceso de su proceso de Java, simplemente puede ejecutar el
jps
comando.Además, puede analizar su volcado de subprocesos producido por jstack en TDA (Thread Dump Analyzer), como la herramienta de análisis de subprocesos o subprocesos rápidos .
fuente
ManagementFactory.getThreadMXBean().getAllThreadIds()
fuente