会,Thread.sleep 使当前线程进入 TIMED_WAITING 状态,释放 CPU 时间片但不释放 synchronized 或 ReentrantLock 锁,需捕获 InterruptedException 并建议恢复中断状态。
Thread.sleep 会释放 CPU 吗?
会。调用
后,当前线程进入 TIMED_WAITING 状态,操作系统会将其从运行队列移出,不占用 CPU 时间片,直到指定毫秒数过去或被中断。
怎么正确调用 Thread.sleep 避免阻塞和异常
它抛出
,必须处理,否则编译失败;忽略它或吞掉异常是常见错误。
必须用 try-catch 包裹,不能只声明 throws(尤其在 Runnable/lambda 中)
捕获后建议恢复中断状态:调用
传入负数会立即抛出
传入 0 表示“让出当前时间片,但不保证休眠”,等价于
的弱化版
示例:
Thread.sleep 和 Object.wait 的关键区别
两者都让线程等待,但语义和行为完全不同:
不释放任何锁,即使在 synchronized 块中调用,锁依然持有
必须在 synchronized 块内调用,且会释放当前持有的该对象锁
只能被
中断;
还可被
唤醒
没有对象依赖,适合纯延时场景(如轮询间隔、限流降频)
为什么 sleep(1) 实际可能停顿远大于 1ms
这是操作系统调度精度和 JVM 实现共同导致的:
Windows 默认定时器精度约 15.6ms,
往往实际停 15–16ms
Linux 下受
和 CFS 调度影响,通常更准,但仍非微秒级
JVM 不做补偿,不会“补足”误差;连续 sleep 累积偏差明显
高精度延时(如音视频同步)应避免依赖
,改用
或系统级 timer
真正需要亚毫秒控制时,
就不是合适工具了——它设计目标本就是“粗粒度休眠”,不是实时调度原语。
Thread.sleepInterruptedExceptionThread.currentThread().interrupt()IllegalArgumentExceptionThread.yield()try {
Thread.sleep(1000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
// 或根据业务决定是否退出循环、清理资源
}Thread.sleepObject.waitThread.sleepinterrupt()waitnotify()sleep(1)CONFIG_HZThread.sleepLockSupport.parkNanosThread.sleep