Respuestas:
Para obtener un conjunto iterable:
Set<Thread> threadSet = Thread.getAllStackTraces().keySet();
Obtenga un identificador para la raíz ThreadGroup
, así:
ThreadGroup rootGroup = Thread.currentThread().getThreadGroup();
ThreadGroup parentGroup;
while ((parentGroup = rootGroup.getParent()) != null) {
rootGroup = parentGroup;
}
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:
Thread[] threads = new Thread[rootGroup.activeCount()];
while (rootGroup.enumerate(threads, true ) == threads.length) {
threads = new Thread[threads.length * 2];
}
Observe cómo llamamos a enumerate () repetidamente hasta que la matriz sea lo suficientemente grande como para contener todas las entradas.
rootGroup
, debe usar new 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:
kill -3 processid
y la VM hará un volcado de subprocesos a stdout.
Puede obtener mucha información sobre subprocesos de ThreadMXBean .
Llame al método estático ManagementFactory.getThreadMXBean () para obtener una referencia al MBean.
¿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 enviando kill pid --QUIT
en Linux.
Los usuarios de Apache Commons pueden usar ThreadUtils
. La implementación actual utiliza el enfoque de caminar por el grupo de subprocesos descrito anteriormente.
for (Thread t : ThreadUtils.getAllThreads()) {
System.out.println(t.getName() + ", " + t.isDaemon());
}
En Groovy puedes llamar a métodos privados
// Get a snapshot of the list of all threads
Thread[] threads = Thread.getThreads()
En Java , puede invocar ese método utilizando la reflexión siempre que el administrador de seguridad lo permita.
Fragmento de código para obtener una lista de hilos iniciados por el hilo principal:
import java.util.Set;
public class ThreadSet {
public static void main(String args[]) throws Exception{
Thread.currentThread().setName("ThreadSet");
for ( int i=0; i< 3; i++){
Thread t = new Thread(new MyThread());
t.setName("MyThread:"+i);
t.start();
}
Set<Thread> threadSet = Thread.getAllStackTraces().keySet();
for ( Thread t : threadSet){
if ( t.getThreadGroup() == Thread.currentThread().getThreadGroup()){
System.out.println("Thread :"+t+":"+"state:"+t.getState());
}
}
}
}
class MyThread implements Runnable{
public void run(){
try{
Thread.sleep(5000);
}catch(Exception err){
err.printStackTrace();
}
}
}
salida:
Thread :Thread[MyThread:2,5,main]:state:TIMED_WAITING
Thread :Thread[MyThread:0,5,main]:state:TIMED_WAITING
Thread :Thread[MyThread:1,5,main]:state:TIMED_WAITING
Thread :Thread[ThreadSet,5,main]:state:RUNNABLE
Si necesita todos los hilos, incluidos los hilos del sistema, que su programa no ha iniciado, elimine la siguiente condición.
if ( t.getThreadGroup() == Thread.currentThread().getThreadGroup())
Ahora salida:
Thread :Thread[MyThread:2,5,main]:state:TIMED_WAITING
Thread :Thread[Reference Handler,10,system]:state:WAITING
Thread :Thread[MyThread:1,5,main]:state:TIMED_WAITING
Thread :Thread[ThreadSet,5,main]:state:RUNNABLE
Thread :Thread[MyThread:0,5,main]:state:TIMED_WAITING
Thread :Thread[Finalizer,8,system]:state:WAITING
Thread :Thread[Signal Dispatcher,9,system]:state:RUNNABLE
Thread :Thread[Attach Listener,5,system]:state:RUNNABLE
public static void main(String[] args) {
// Walk up all the way to the root thread group
ThreadGroup rootGroup = Thread.currentThread().getThreadGroup();
ThreadGroup parent;
while ((parent = rootGroup.getParent()) != null) {
rootGroup = parent;
}
listThreads(rootGroup, "");
}
// List all threads and recursively list all subgroup
public static void listThreads(ThreadGroup group, String indent) {
System.out.println(indent + "Group[" + group.getName() +
":" + group.getClass()+"]");
int nt = group.activeCount();
Thread[] threads = new Thread[nt*2 + 10]; //nt is not accurate
nt = group.enumerate(threads, false);
// List every thread in the group
for (int i=0; i<nt; i++) {
Thread t = threads[i];
System.out.println(indent + " Thread[" + t.getName()
+ ":" + t.getClass() + "]");
}
// Recursively list all subgroups
int ng = group.activeGroupCount();
ThreadGroup[] groups = new ThreadGroup[ng*2 + 10];
ng = group.enumerate(groups, false);
for (int i=0; i<ng; i++) {
listThreads(groups[i], indent + " ");
}
}
Para obtener una lista de subprocesos y sus estados completos utilizando el terminal, puede usar el siguiente comando:
jstack -l <PID>
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 .