sleep()使线程从RUNNABLE立即进入TIMED_WAITING状态,超时自动返回RUNNABLE,不释放锁,仅依赖内部计时器,无需其他线程唤醒。

调用 sleep() 时,线程会从 RUNNABLE 状态立即转入 TIMED_WAITING 状态,不是阻塞(BLOCKED),也不是普通等待(WAITING)——它是一种带时间限制的主动挂起,超时后自动回归 RUNNABLE,无需其他线程唤醒。
sleep 触发的状态切换路径很明确
Java 线程状态模型中,sleep() 是唯一由线程自身发起、且仅依赖内部计时器就能完成状态转换的操作之一:
- 调用前:线程处于 RUNNABLE(含“就绪”和“运行中”两种操作系统层面状态)
- 调用瞬间:JVM 将其标记为 TIMED_WAITING,并交由操作系统调度器移出 CPU 执行队列
- 休眠期间:线程不占用 CPU,但保持所有已获取的锁(如 synchronized 持有的 monitor)
- 时间到期:JVM 自动将其状态切回 RUNNABLE,等待调度器分配时间片
定时机制决定状态持续时间,而非调度行为
sleep(long millis) 的参数是“建议休眠时长”,实际暂停时间受系统定时器精度和 JVM 调度策略影响:
- 不会因线程优先级低而延长;也不会因高优先级而提前结束
- 即使 CPU 空闲,线程也不会提前醒来——必须等到计时器触发
- 若被
interrupt()中断,会立即抛出InterruptedException并退出 TIMED_WAITING,状态转为 RUNNABLE(但通常紧接着终止或处理中断)
与 wait()、park() 的定时逻辑有本质区别
同样是“等一段时间”,不同方法背后的状态语义完全不同:
立即学习“Java免费学习笔记(深入)”;
-
wait(timeout):必须在 synchronized 块内调用,会释放锁,进入 TIMED_WAITING,但需靠 notify 或超时才能唤醒 -
LockSupport.parkNanos(nanos):不释放锁,也不依赖对象监视器,TIMED_WAITING 状态由底层 UNSAFE 操作控制,唤醒靠unpark() -
sleep():无锁依赖、无协作要求、纯时间驱动,是最轻量级的“我等一会儿就回来”操作
验证状态切换只需一行代码
用 Thread.getState() 可直接观察变化,例如:
Thread.sleep(100); // 给 t1 一点执行时间
System.out.println(t1.getState()); // 大概率输出 TIMED_WAITING


















