睡觉的状态是什么状态?

时间:2014-11-16 23:31:16

标签: java multithreading concurrency

我正在寻找关于以下内容的验证/论据:

在任何时间点,线程都是5(+1 {2 WAITINGstates中的一个。

假设线程T调用

  

的Thread.sleep(3000);

因此让自己进入睡眠状态3秒钟。

在这3秒内它处于哪种状态?

显然start() - ed且仍然存在,因此既不是NEW也不是TERMINATED

它没有等待任何锁定。事实上,它没有释放它在此调用之前的任何锁定,因此它不是BLOCKED

它不是在等待另一个线程。在某种意义上等待自己 - 但这不是WAITING状态的规范。线索进入WAITING状态的原因之一是:Object.wait()Thread.join()LockSupport.park()

所以它应该是RUNNABLE - 在线程状态中唯一遗漏的。 但是,RUNNABLE是线程在JVM上执行的状态 - 启用CPU时间,从而用于刻录资源。 处于CPU时间表的睡眠线程似乎是矛盾的。

我在这里遗漏了什么吗?

TIA。

1 个答案:

答案 0 :(得分:9)

Thead.State.TIMED_WAITING reads的Javadoc:

  

具有指定等待时间的等待线程的线程状态。由于在指定的正等待时间内调用以下方法之一,线程处于定时等待状态:

     
      
  • Thread.sleep
  •   
  • Object.wait超时
  •   
  • Thread.join超时
  •   
  • LockSupport.parkNanos
  •   
  • LockSupport.parkUntil
  •   

实际上,以下测试程序打印TIMED_WAITING:

public class Test {
    public static void main(String[] args) throws Exception {
        Thread t = new Thread() {
            public void run() {
                try {
                    Thread.sleep(10000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            };
        };
        t.start();
        Thread.sleep(100); // make sure the other thread has started
        System.out.println(t.getState());
    }
}