sleep方法:是Thread类的静态方法,当前线程将睡眠n毫秒,线程进入阻塞状态。当睡眠时间到了,会解除阻塞,进入可运行状态,等待CPU的到来。睡眠不释放锁(如果有的话)
wait方法:是Object的方法,必须与synchronized关键字一起使用,线程进入阻塞状态,当notify或者notifyall被调用后,会解除阻塞。但是,只有重新占用互斥锁之后才会进入可运行状态。睡眠时,会释放互斥锁;
在 Java 中,sleep() 和 wait() 都是用于线程控制的方法,但它们有以下几个关键区别:
- 所属类不同
sleep()是Thread类的静态方法wait()是Object类的实例方法
- 对锁的影响不同
sleep()不会释放当前线程所持有的锁wait()会释放当前线程所持有的锁,让其他线程有机会获取该锁
- 唤醒方式不同
sleep()时间到后会自动唤醒,或者被interrupt()方法中断唤醒wait()需要其他线程调用相同对象的notify()或notifyAll()方法才能唤醒,或者指定等待时间后自动唤醒
- 使用场景不同
sleep()通常用于暂停线程执行一段固定时间,不依赖于其他线程的状态wait()通常用于线程间通信,让线程等待某个条件满足后再继续执行
- 调用要求不同
sleep()可以在任何地方调用,不需要持有对象锁wait()必须在同步代码块(synchronized)中调用,且当前线程必须持有该对象的锁
示例代码:
1 | // sleep() 示例 |
需要注意的是,当 wait() 被唤醒后,线程不会立即执行,而是需要重新获取对象锁后才能继续执行。