2012-07-18 13 views
11

Busco una manera de ver el número de hilos que se están ejecutando¿Cómo verificar el número de subprocesos actualmente en ejecución en Java?

  1. A través de Windows primero
  2. programación
+2

Qué quiere decir mediante programación? – Keppil

+0

Soy nuevo en el manejo de múltiples hilos. Tengo un programa Java que usa el grupo de subprocesos con el tamaño 10. Mientras el programa se está ejecutando, ¿cómo puedo verificar cuántos subprocesos están ejecutando actualmente mi programa? Necesito una forma de hacerlo a través de Windows y también a través del programa mismo imprimiendo el número de subprocesos actualmente en ejecución en ese momento. –

Respuesta

26

Esto le dará la número total de subprocesos en su máquina virtual:

int nbThreads = Thread.getAllStackTraces().keySet().size(); 

Ahora, si desea que todos los hilos se ejecuten actualmente G, se pueden hacer eso:

int nbRunning = 0; 
for (Thread t : Thread.getAllStackTraces().keySet()) { 
    if (t.getState()==Thread.State.RUNNABLE) nbRunning++; 
} 

Los estados posibles se enumeran aquí: Thread.State javadoc

Si usted quiere ver correr hilos no programmaticaly pero con una herramienta de Windows, se puede usar Process Explorer.

0

Desde Windows:

Hay muchas posibilidades de encontrar un performance counter de el proceso que puede decirte eso.

programación:

Hay Thread#activeCount:

devuelve una estimación del número de hilos activos en grupo de hilos de la rosca actual y sus subgrupos. Recursivamente itera sobre todos los subgrupos en el grupo de hilos del hilo actual.

O más directamente, ThreadGroup#activeCount:

devuelve una estimación del número de hilos activos en este grupo de hilos y sus subgrupos.

y ThreadGroup#getParent:

Devuelve el elemento principal de este grupo de hilos.

Primero, si el padre no es nulo, se llama al método checkAccess del grupo de hilos principal sin argumentos; esto puede dar como resultado una excepción de seguridad.

Todo lo cual parece sugerir algo a lo largo de las líneas de:

int activeThreadTotalEstimate() { 
    ThreadGroup group; 
    ThreadGroup parent; 

    group = Thread.currentThread().getThreadGroup(); 
    while ((parent = group.getParent()) != null) { 
     group = parent; 
    } 
    return group.activeCount(); 
} 
1

En respuesta a su siguiente comentario

En el siguiente fragmento de código: mientras que (resultSet.next()) { name = resultSet.getString ("HNAME"); MyRunnable worker = new MyRunnable (hName); threadExecutor.execute (trabajador); }. Mi hilo piscina tiene un tamaño de 10.Necesito asegurarme de que mi programa funcione correctamente con con múltiples hilos de rosca & y quiera verificar cuántos hilos son ejecutándose en un momento determinado. ¿Cómo puedo hacer esto?

a otra respuesta, le sugiero que informe su código con JVisualVM y compruebe si su grupo de subprocesos funciona como debería. La razón detrás de esta sugerencia es que no tiene que preocuparse por todos los otros hilos de limpieza que maneja JVM. Además de lo que quieres hacer es por qué herramientas como JVisualVM están hechas para.

Si es la primera vez que crea perfiles de programas Java, JVisualVM le permite ver lo que sucede debajo del capó mientras está ejecutando su código. Puede ver la actividad Heap, GC, inspeccionar los subprocesos en ejecución/esperar cualquier muestra/perfil de su CPU o uso de memoria. Hay bastantes plugins también.

0

Fragmento de código:

import java.util.Set; 
import java.lang.Thread.State; 
public class ActiveThreads { 
    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() && 
       t.getState() == Thread.State.RUNNABLE){ 
       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(); 
     } 
    } 
} 

de salida:

Thread :Thread[main,5,main]:state:RUNNABLE 
Thread count started by Main thread:1 

Explicación:

Thread.getAllStackTraces().keySet() te ofrece la lista de todos los temas, que han sido iniciadas por tanto Program and System. En ausencia del estado ThreadeGroup, obtendrá el número de hilos del sistema si están activos.

Reference Handler, Signal Dispatcher,Attach Listener and Finalizer

Cuestiones relacionadas