sleep()属于Thread类,不释放锁;wait()属于Object类,需在同步块中调用并释放锁,二者调用方式与锁处理机制不同。

在 Java 中,sleep() 和 wait() 都能让线程暂停执行一段时间,但它们的使用场景、所属类和对锁的处理方式完全不同。
1. 所属类和调用方式不同
sleep() 是 Thread 类 的静态方法,直接通过 Thread.sleep() 调用,作用于当前线程。
wait() 是 Object 类 的方法,必须在同步块或同步方法中由对象调用,例如 obj.wait(),表示当前线程等待该对象的唤醒信号。
2. 是否释放锁
这是两者最核心的区别:
– 调用 sleep() 后,线程虽然暂停运行,但不会释放已持有的监视器锁(synchronized 锁)。
– 调用 wait() 时,线程会,并进入该对象的等待队列,允许其他线程获取锁并执行同步代码。
3. 唤醒机制不同
– sleep() 只能在指定时间结束后自动唤醒,或者被中断(interrupt)提前唤醒。
– wait() 必须由另一个线程调用同一个对象的 notify() 或 notifyAll() 方法才能唤醒。
4. 使用环境限制
– sleep() 可以在任何地方使用,不需要在 synchronized 块中。
– wait() 必须在 synchronized 方法或代码块中调用,否则会抛出 IllegalMonitorStateException。
基本上就这些。简单说:sleep 是“睡一会儿”,不放锁;wait 是“等通知”,要放锁,等别人叫你起来。


