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();
Puede obtener mucha información sobre los subprocesos de ThreadMXBean .
Llame al método estático ManagementFactory.getThreadMXBean() para obtener una referencia al MBean.
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 + " ");
}
}