2009-12-01 12 views
24

¿Hay alguna solución clara de saber cuándo se ha puesto un hilo en el estado wait? Estoy colocando hilos en wait y I notify cuando lo necesito. Pero a veces quiero saber si un hilo está esperando actualmente, y si es así, tengo que hacer algo más.Java - ¿Cómo saber cuándo está esperando el hilo?

Probablemente podría establecer una bandera en verdadero/falso. Pero no puedo imaginar que haya una mejor manera de hacer esto?

Respuesta

37

El método getState() de un hilo devuelve un Thread.State que puede ser:

NUEVO, RUNNABLE, bloqueado, ESPERA, TIMED_WAITING o terminado

Ver Thread.State.

+1

Es Thread.State en lugar de Thread.Status – JuanZe

+1

Por supuesto, en el momento en el método ha vuelto al estado pueden haber cambiado. –

0

Usted puede tener toda la información que desea usar el ThreadMXBean.

probar este código:

package com.secutix.gui.seatmap; 

import java.lang.management.ManagementFactory; 
import java.lang.management.ThreadInfo; 
import java.lang.management.ThreadMXBean; 

public class ThreadStatus { 

    private static final ThreadMXBean mbean = ManagementFactory.getThreadMXBean(); 

    public static void main(String[] args) { 
     for (int i = 0; i < 3; i++) { 
      buildAndLaunchThread(i); 
     } 

     Thread t = new Thread(){ 

      @Override 
      public void run() { 
       while(true){ 
        printThreadStatus(); 
        try { 
         sleep(3000); 
        } catch (InterruptedException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
       } 

      } 

     }; 
     t.setName("detector"); 
     t.start(); 

    } 

    protected static void printThreadStatus() { 
     ThreadInfo[] infos = mbean.dumpAllThreads(true, true); 

     for (ThreadInfo threadInfo : infos) { 
      System.out.println(threadInfo.getThreadName() + " state = " + threadInfo.getThreadState()); 
     } 

    } 

    private static void buildAndLaunchThread(int i) { 
     Thread t1 = new Thread(){ 

      @Override 
      public void run() { 
       while(true){ 
        try { 
         sleep(3000); 
        } catch (InterruptedException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
       } 

      } 

     }; 
     t1.setName("t" + i); 
     t1.start(); 

    } 
} 
Cuestiones relacionadas