我正在寻找关于以下内容的验证/论据:
在任何时间点,线程都是5(+1 {2 WAITING
)states中的一个。
假设线程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。
答案 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());
}
}