threads thread starvation concurrent java multithreading jvm

starvation - java use thread



Obtener una lista de todos los subprocesos que se ejecutan actualmente en Java (12)

¿Hay alguna forma de que pueda obtener una lista de todos los subprocesos en ejecución en la JVM actual (incluidos los subprocesos NO iniciados por mi clase)?

¿También es posible obtener los objetos Thread y Class de todos los Thread en la lista?

Quiero poder hacer esto a través del código.


¿Has echado un vistazo a jconsole ?

Esto mostrará una lista de todos los subprocesos que se ejecutan para un proceso Java en particular.

Puede iniciar jconsole desde la carpeta bin JDK.

También puede obtener un seguimiento de pila completo para todos los subprocesos Ctrl+Break en Windows o enviando kill pid --QUIT en Linux.


En Groovy puedes llamar 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.


En la consola de java, pulsa Ctrl-Break . Enumera todos los subprocesos más información sobre el montón. Esto no te dará acceso a los objetos por supuesto. Pero puede ser muy útil para la depuración de todos modos.


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 subprocesos, incluidos los subprocesos del sistema, que su programa no haya 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


Los usuarios de Apache commons pueden usar ThreadUtils. La implementación actual utiliza el enfoque de caminar en el grupo de hilos descrito anteriormente.

for (Thread t : ThreadUtils.getAllThreads()) { System.out.println(t.getName() + ", " + t.isDaemon()); }


Obtener un identificador para el grupo de ThreadGroup raíz, como esto:

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

Ahora, llame repetidamente a la función enumerate() en el grupo raíz. El segundo argumento le permite obtener todos los hilos, recursivamente:

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.


Para obtener un conjunto iterable:

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



Puedes probar algo como esto:

Thread.getAllStackTraces().keySet().forEach((t) -> System.out.println(t.getName() + "/nIs Daemon " + t.isDaemon() + "/nIs Alive " + t.isAlive()));

y, obviamente, puede obtener más características de hilo si es necesario.


Sí, eche un vistazo a 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 máquina virtual hará un volcado de hilo a la salida estándar.



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 + " "); } }