2009-12-17 7 views

Respuesta

38

herramienta útil para depurar programas Java, que da el número de hilos y otra información relevante sobre ellos:

jconsole <process-id>

+0

Los otros métodos también son buenos, pero esto es más útil. – ndemir

15

Hay un método estático de la clase de Thread que devolverá el número de hilos activos controlados por la JVM:

Thread.activeCount()

devuelve el número de hilos activos en grupo de hilos de la rosca actual.

Además, los depuradores externos deben enumerar todos los hilos activos (y le permiten suspender cualquier número de ellos) si desea supervisarlos en tiempo real.

2
public class MainClass { 

     public static void main(String args[]) { 

      Thread t = Thread.currentThread(); 
      t.setName("My Thread"); 

      t.setPriority(1); 

      System.out.println("current thread: " + t); 

      int active = Thread.activeCount(); 
      System.out.println("currently active threads: " + active); 
      Thread all[] = new Thread[active]; 
      Thread.enumerate(all); 

      for (int i = 0; i < active; i++) { 
      System.out.println(i + ": " + all[i]); 
      } 
     } 
    } 
54

ManagementFactory.getThreadMXBean().getThreadCount() no se limita a grupos de subprocesos como Thread.activeCount() hace.

+0

+1 Para esto. La cantidad de hilo es exactamente la misma que veo en 'top'. Aunque en la ventana de depuración, solo veo 2 subprocesos en ejecución en lugar de 5.:/ – Aruman

+0

ManagementFactory? ¿bajo qué paquete? – Meher

+1

@ 421 el texto está vinculado a Javadocs ... – gustafc

3

He escrito un programa para recorrer toda Threads creado e imprimir getState() de cada Thread

import java.util.Set; 

public class ThreadStatus { 
    public static void main(String args[]) throws Exception{ 
     for (int i=0; i< 5; i++){ 
      Thread t = new Thread(new MyThread()); 
      t.setName("MyThread:"+i); 
      t.start(); 
     } 
     int threadCount = 0; 
     Set<Thread> threadSet = Thread.getAllStackTraces().keySet(); 
     for (Thread t : threadSet){ 
      if (t.getThreadGroup() == Thread.currentThread().getThreadGroup()){ 
       System.out.println("Thread :"+t+":"+"state:"+t.getState()); 
       ++threadCount; 
      } 
     } 
     System.out.println("Thread count started by Main thread:"+threadCount); 
    } 
} 

class MyThread implements Runnable{ 
    public void run(){ 
     try{ 
      Thread.sleep(2000); 
     }catch(Exception err){ 
      err.printStackTrace(); 
     } 
    } 
} 

Salida:

java ThreadStatus 

Thread :Thread[MyThread:0,5,main]:state:TIMED_WAITING 
Thread :Thread[main,5,main]:state:RUNNABLE 
Thread :Thread[MyThread:1,5,main]:state:TIMED_WAITING 
Thread :Thread[MyThread:4,5,main]:state:TIMED_WAITING 
Thread :Thread[MyThread:2,5,main]:state:TIMED_WAITING 
Thread :Thread[MyThread:3,5,main]:state:TIMED_WAITING 
Thread count started by Main thread:6 

Si se quita la condición abajo

if (t.getThreadGroup() == Thread.currentThread().getThreadGroup()) 

Se hará obtener debajo de los hilos en la salida también, whi ch han sido iniciados por el sistema.

Reference Handler, Signal Dispatcher,Attach Listener and Finalizer.

2

Solución genérica que no requiere una interfaz gráfica de usuario como jconsole (no funciona en terminales remotos), ps funciona para procesos que no son Java, no requiere una JVM instalada.

ps -o nlwp <pid>

2

El uso de comandos de Linux Top

top -H -p (process id)

usted podría conseguir identificador de proceso de un programa por este método:

ps aux | grep (your program name)

por ejemplo:

ps aux | grep user.py

Cuestiones relacionadas