我想问下,有没有什么方法可以知到线程的状态是否为阻塞?谢谢各位了。

解决方案 »

  1.   

    Thread.getState()
    public Thread.State getState()返回该线程的状态。 该方法用于监视系统状态,不用于同步控制。public static enum Thread.Stateextends Enum<Thread.State>线程状态。线程可以处于下列状态之一: NEW
    至今尚未启动的线程处于这种状态。 
    RUNNABLE
    正在 Java 虚拟机中执行的线程处于这种状态。 
    BLOCKED
    受阻塞并等待某个监视器锁的线程处于这种状态。 
    WAITING
    无限期地等待另一个线程来执行某一特定操作的线程处于这种状态。 
    TIMED_WAITING
    等待另一个线程来执行取决于指定等待时间的操作的线程处于这种状态。 
    TERMINATED
    已退出的线程处于这种状态。 
    在给定时间点上,一个线程只能处于一种状态。这些状态是虚拟机状态,它们并没有反映所有操作系统线程状态。 
      

  2.   

    呵呵,上楼说的方法不行,如:
    public class DFDFDFDFD {
    public static void main(String[] args) throws InterruptedException{
    Thread th=new Thread(new Runnable(){
    public void run(){
    Scanner in=new Scanner(System.in);
    String s=in.next();
    System.out.println("*");
    }
    });
    th.start();
    Thread.sleep(500);
    System.out.println(th.getState());
    }
    }
    这时输出的为:RUNNABLE
      

  3.   

    IO的阻塞是很特殊的吧
    State.BLOCKED只能针对Object.wait()做出反应
      

  4.   

    当然是RUNNABLE!Thread.sleep(500); 
    System.out.println(th.getState()); //这里只有Sleep之后才会执行,所以线程已经开始运行了,所以是RUNNABLE
    你必须在另外一个线程中打印信息才可能列出BLOCK
      

  5.   

    不懂上楼的意思,th引用的线程对像不是在IO阻塞中吗?那个线程一在在阻塞,和Sleep没关系。