【发布时间】:2014-11-17 07:39:29
【问题描述】:
我正在寻找以下方面的验证/论据:
在任何时间点,一个线程都恰好位于 5 个(+1 -- 2 表示WAITING)states 之一。
假设一个线程T调用
线程.sleep(3000);
并因此使自己进入睡眠状态 3 秒。
在这 3 秒内它处于哪种状态?
它显然是start()-ed 并且还活着,因此既不是NEW 也不是TERMINATED。
它没有等待任何锁。事实上,它还没有释放它在这次调用之前的任何锁,所以它不是BLOCKED。
它没有在另一个线程上等待。在某种意义上是在等待自己——但这不是WAITING 状态的规范。使线程进入WAITING 状态的是以下调用之一:Object.wait()、Thread.join() 和LockSupport.park()。
所以它应该是RUNNABLE——线程状态中唯一遗漏的一个。
但是,RUNNABLE 是线程在 JVM 上执行的状态——启用 CPU 时间并因此消耗资源。
处于 CPU 计划中的睡眠线程似乎是矛盾的。
我有什么遗漏吗?
TIA。
【问题讨论】:
-
它被阻塞了,它正在等待操作系统唤醒它以进行 I/O。
-
关于“RUNNABLE 是线程在 JVM 上执行的状态”,当您谈论 Java 库的 Thread.getState() 时是这样,但以防万一您感兴趣;在许多操作系统的命名法中,“可运行”意味着线程未“运行”,因为它正在等待可用的 CPU 运行。
标签: java multithreading concurrency