Java中sleep和wait的区别

3,639 阅读1分钟

基础简介

sleep() 方法让当前线程停止运行一段时间,到期自动继续执行。

wait() 方法让线程停止运行,在 notify()notifyAll() 后继续执行。

相同

  1. sleep()wait() 调用都会暂停当前线程并让出 CPU

不同

  1. 定义位置不同:sleep() 是线程类(Thread)的方法;wait() 是顶级类 Object 的方法;

  2. 调用地方不同:sleep 方法可以在任何地方使用;wait 方法则只能在同步方法或同步块中使用;

  3. 锁资源释放方式不同:sleep 方法只让出了CPU,没有释放同步资源锁! wait方法则是指当前线程让自己暂时退让出同步资源锁,以便其他正在等待该资源的线程得到该资源进而运行,只有调用了notify方法,之前调用wait()的线程才会解除wait状态,可以去参与竞争同步资源锁,进而得到执行。

  4. 恢复方式不同:sleep调用后停止运行期间仍持有同步锁,所以到时间会继续执行;wait调用会放弃对象锁,进入等待队列,待调用notify()/notifyAll()唤醒指定的线程或者所有线程,才会进入锁池,再次获得对象锁后才会进入运行状态,在没有获取对象锁之前不会继续执行;

  5. 异常捕获:sleep需要捕获或者抛出异常,而wait/notify/notifyAll则不需要。