Java 睡眠线处于什么状态?

Java 睡眠线处于什么状态?,java,multithreading,concurrency,Java,Multithreading,Concurrency,我正在寻找以下方面的验证/论据: 在任何时间点,一个线程正好位于5个线程中的一个(+1--2表示等待) 假设一个线程T调用 睡眠(3000) 从而使自己进入睡眠状态3秒钟 在这3秒钟内它处于哪个状态 它显然是start()-ed并且仍然是活动的,因此既不是新的也不是终止的 它没有等待任何锁。事实上,它在调用之前没有释放任何锁,因此它没有被阻止 它不是在等待另一个线程。从某种意义上说,它本身在等待,但这不是waiting状态的规范。使线程进入等待状态的是以下调用之一:Object.wait()、t

我正在寻找以下方面的验证/论据:

在任何时间点,一个线程正好位于5个线程中的一个(+1--2表示等待)

假设一个线程
T
调用

睡眠(3000)

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

在这3秒钟内它处于哪个状态

它显然是
start()
-ed并且仍然是活动的,因此既不是
新的
也不是
终止的

它没有等待任何锁。事实上,它在调用之前没有释放任何锁,因此它没有被阻止

它不是在等待另一个线程。从某种意义上说,它本身在等待,但这不是
waiting
状态的规范。使线程进入等待状态的是以下调用之一:
Object.wait()
thread.join()
LockSupport.park()

因此,它应该是
RUNNABLE
——线程状态中唯一遗漏的一个。 然而,
RUNNABLE
是一个线程在JVM上执行的状态——在CPU时间内启用,从而燃烧资源。 CPU调度上的休眠线程似乎是矛盾的

我有什么遗漏吗


蒂亚

Thead.State.TIMED\u的Javadoc正在等待:

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

  • Thread.sleep
  • 对象。等待
    超时
  • Thread.join
    超时
  • LockSupport.parknos
  • LockSupport.parking直到
事实上,以下测试程序会打印定时等待:

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());
    }
}

它被阻塞了,它正在等待操作系统唤醒它,等待I/O.Re“RUNNABLE是线程在JVM上执行的状态”,当您谈论Java库的thread.getState()时,这是真的,但以防万一您感兴趣;在许多操作系统的术语中,“runnable”意味着线程没有“运行”,因为它正在等待一个可用的CPU在.thx上运行,以获得有用的ans.read waiting only-传递的TIMED_一直在等待。在我身上也发生了类似的事情,这让我来到了这里。