Java中sleep方法使当前线程进入TIMED_WAITING状态,不释放锁,是Thread类静态方法,需处理InterruptedException,与wait()在锁释放、调用位置和唤醒机制上本质不同。

Java 中的 sleep 方法会让当前线程暂停执行指定时间,进入限时等待状态(TIMED_WAITING),期间不释放已持有的锁,也不参与 CPU 调度。
sleep 是静态方法,作用于当前线程
Thread.sleep(long millis) 或 Thread.sleep(long millis, int nanos) 只能让调用它的线程休眠,不能指定其他线程。例如:
在主线程中调用 Thread.sleep(1000),主线程会暂停 1 秒;在子线程的 run() 方法里调用,就是该子线程休眠。
- 必须由目标线程自己调用,无法“远程控制”别的线程休眠
- 调用后线程状态立即变为 TIMED_WAITING,直到时间到期或被中断
- 不会释放 synchronized 锁 —— 即使休眠中,其他线程也无法进入该线程正持有的同步块
必须处理 InterruptedException
sleep 声明抛出 InterruptedException,这是受检异常,不捕获或声明就会编译失败。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
常见写法是捕获后选择恢复中断状态(推荐)或直接处理:
- 捕获后调用
Thread.currentThread().interrupt(),保持中断信号可传递 - 不建议简单吞掉异常(如空 catch),否则可能掩盖线程取消意图
- 如果上层方法允许抛出,也可直接 throws,由调用方决定如何响应中断
与 wait() 的关键区别
sleep 和 wait() 都导致线程等待,但机制完全不同:
-
sleep不依赖对象监视器,无需在 synchronized 块内调用 -
wait()必须在 synchronized 中调用,且会释放锁;sleep从不释放锁 -
wait()可被notify()提前唤醒;sleep()只能靠时间到期或中断退出 -
sleep()是Thread类的静态方法;wait()是Object的实例方法
实际使用注意点
看似简单,但几个细节容易出错:
- 参数为负数会抛
IllegalArgumentException,0 表示“尽力让出 CPU”,但不保证休眠 - 实际休眠时间可能略长于指定值,受系统定时器精度和调度延迟影响
- 不要用
sleep实现忙等待或轮询逻辑,应优先考虑wait/notify、LockSupport或并发工具类 - 在循环中调用 sleep 时,务必检查中断状态,避免忽略外部终止请求

















