sleep方法:是Thread类的静态方法,当前线程将睡眠n毫秒,线程进入阻塞状态。当睡眠时间到了,会解除阻塞,进入可运行状态,等待CPU的到来。睡眠不释放锁(如果有的话)

wait方法:是Object的方法,必须与synchronized关键字一起使用,线程进入阻塞状态,当notify或者notifyall被调用后,会解除阻塞。但是,只有重新占用互斥锁之后才会进入可运行状态。睡眠时,会释放互斥锁;

在 Java 中,sleep()wait() 都是用于线程控制的方法,但它们有以下几个关键区别:

  1. 所属类不同
  • sleep()Thread 类的静态方法
  • wait()Object 类的实例方法
  1. 对锁的影响不同
  • sleep() 不会释放当前线程所持有的锁
  • wait() 会释放当前线程所持有的锁,让其他线程有机会获取该锁
  1. 唤醒方式不同
  • sleep() 时间到后会自动唤醒,或者被 interrupt() 方法中断唤醒
  • wait() 需要其他线程调用相同对象的 notify()notifyAll() 方法才能唤醒,或者指定等待时间后自动唤醒
  1. 使用场景不同
  • sleep() 通常用于暂停线程执行一段固定时间,不依赖于其他线程的状态
  • wait() 通常用于线程间通信,让线程等待某个条件满足后再继续执行
  1. 调用要求不同
  • sleep() 可以在任何地方调用,不需要持有对象锁
  • wait() 必须在同步代码块(synchronized)中调用,且当前线程必须持有该对象的锁

示例代码:

1
2
3
4
5
6
7
8
9
// sleep() 示例
Thread.sleep(1000); // 让当前线程休眠1秒,不释放锁

// wait() 示例
synchronized (obj) {
obj.wait(); // 释放obj对象的锁,进入等待状态
// 或指定等待时间
obj.wait(1000); // 最多等待1秒
}

需要注意的是,当 wait() 被唤醒后,线程不会立即执行,而是需要重新获取对象锁后才能继续执行。