本质区别在于“为什么暂停”和“暂停时如何对待锁”:sleep是Thread类静态方法,不释放锁,用于定时暂停;wait是Object类实例方法,必须在synchronized中调用,会释放锁,用于线程协作等待条件。

本质区别不在“能不能暂停”,而在“为什么暂停”和“暂停时怎么对待锁”。
归属与调用前提不同
sleep 是 Thread 类的静态方法,谁调用就让谁睡,哪儿都能写,比如 Thread.sleep(1000);wait 是 Object 类的实例方法,必须先拿到对象的锁(也就是在 synchronized 块或方法里),再对那个对象调用 obj.wait(),否则直接抛 IllegalMonitorStateException。
锁的处理方式截然相反
这是最核心的区别:
- sleep 不放锁:线程抱着锁睡觉,其他线程进不了同一把锁保护的同步块,容易造成阻塞等待;
- wait 主动放锁:一调用就释放当前对象的锁,让别的线程能立刻进来操作共享资源,等被 notify 或超时后,还得重新抢锁才能继续执行。
设计目的和唤醒机制不同
sleep 是“我歇会儿,时间到了自己起”,适合模拟延迟、限流、轮询间隔;wait 是“我等条件满足,请别人喊我”,专为线程协作服务,比如生产者-消费者模型中,消费者发现队列空了,就 wait;生产者加完数据后调 notify 唤醒它。
立即学习“Java免费学习笔记(深入)”;
- sleep 只能靠时间到或 interrupt 唤醒;
- wait 可以被 notify()/notifyAll() 唤醒,也可以设超时参数自动返回。
异常处理要求一致但语义不同
两个方法都可能抛 InterruptedException,都必须显式处理。但含义不同:
- sleep 被 interrupt,说明“别睡了,有事干”;
- wait 被 interrupt,说明“别等了,外部强制取消等待”。


















