sleep()与wait()的区别

一、共同点

  • 都可以使线程暂停执行: wait() 方法和 sleep() 方法都可以使当前线程暂停执行一段时间。
  • 都可以用于多线程编程: 无论是 wait() 还是 sleep(),都可以在多线程环境中使用。
  • 都可以在同步块或同步方法中使用: wait() 方法通常与 synchronized 关键字一起使用,因为它需要在同步块或同步方法中调用。而 sleep() 方法可以在任何地方使用,不受同步的限制。
  • 都可以捕获 InterruptedException 异常: 调用 wait() 或 sleep() 方法时,都可能抛出 InterruptedException 异常,因此在使用这两个方法时都需要处理这个异常。

二、不同点

sleep wait
所属类 Thread 线程类 Object 顶级类
方法类型 静态方法 普通方法
释放对象锁 否 是
调用后状态 让出CPU给其他线程,但是他的监控状态依然保持 进入等待此对象的等待锁定池
恢复运行条件 设定的时间到后自动苏醒 未指定超时时间时,不会自动苏醒,需要别的线程调用同一个对象上的 notify()或者 notifyAll() 方法,本线程才进入对象锁定池准备获取对象锁从而进入运行状态;指定了超时时间wait(long timeout) 时,超时后线程会自动苏醒。
应用场景 可以在任何地方使用 只能在同步方法或者同步块中使用。

sleep(time)所设定的时间到后,线程不一定立即苏醒,这是由于CPU的调度原因,线程恢复运行后会进入就绪状态,CPU不一定会立刻分配时间片给该线程,因此,线程苏醒后将会在≥time的时间运行。

即:假设调用sleep(1000),线程将会在≥1000ms后继续运行。

注意,wait()在接收到针对此对象的notify()或者 notifyAll() 方法后,是准备获取对象锁,进入运行状态,而不是立即获得。