睡觉的状态是什么状态?

Roa*_*oam 4 java concurrency multithreading

我正在寻找以下的验证/参数:

在任何时间点,线程都处于5(+1 - 2 for WAITING)状态中的一个.

假设一个线程T调用

了Thread.sleep(3000);

从而使自己进入睡眠状态3秒钟.

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

它显然start()已经存在并且仍然存在,因此既不是NEW也不存在TERMINATED.

它没有等待任何锁定.事实上,它没有释放它在此次调用之前的任何锁定,所以事实并非如此BLOCKED.

它不是在等待另一个线程.在某种意义上等待自己 - 但这不是国家的规范WAITING.什么得到一个线程进入一个WAITING状态是其中一个呼叫:Object.wait(),Thread.join()LockSupport.park().

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

我错过了什么吗?

TIA.

mer*_*ike 9

Thead.State.TIMED_WAITING的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());
    }
}
Run Code Online (Sandbox Code Playgroud)