sleep() 方法和 wait() 方法详解

发布时间 2023-08-30 14:33:59作者: HHHuskie

共同点:两者都可以暂停线程的执行。

区别

  • sleep() 方法没有释放锁,而 wait() 方法释放了锁
  • wait() 通常被用于线程间交互/通信,sleep()通常被用于暂停执行。
  • wait() 方法被调用后,线程不会自动苏醒,需要别的线程调用同一个对象上的 notify()或者 notifyAll() 方法。sleep()方法执行完成后,线程会自动苏醒,或者也可以使用 wait(long timeout) 超时后线程会自动苏醒。
  • sleep()Thread 类的静态本地方法,wait() 则是 Object 类的本地方法。为什么这样设计呢?下一个问题就会聊到。

个人理解:使用sleep时,我们是希望线程过一段时间再继续 运行(如轮询);而使用wait时,我们希望其他线程将某个东西处理至某种状态后通知wait状态线程继续运行(线程交互)。

为什么 wait() 方法不定义在 Thread 中?

wait() 方法不定义在 Thread 类中是因为 wait() 方法是针对对象的,而不是线程本身。在 Java 中,每个对象都有一个内部锁(也称为监视器锁),通过 synchronized 关键字可以获取该锁。wait() 方法需要在获取对象锁的情况下才能调用。

wait() 方法的作用是使线程进入等待状态并放弃对象的锁,等待其他线程调用 notify() 或 notifyAll() 方法来唤醒该线程。因此,wait() 方法应该在希望等待某个条件满足时使用,而不是用于线程的控制。

通过在对象上调用 wait() 方法,线程可以释放对象的锁,并暂时挂起以等待其他线程的通知。这种设计允许多个线程在共享资源时进行协调和同步,提供了更灵活和精细的控制方式。

为什么sleep() 方法定义在 Thread 中?

因为 sleep() 是让当前线程暂停执行,不涉及到对象类,也不需要获得对象锁。

在 Java 中,线程控制相关的方法,例如 start()、join()、sleep() 等,都定义在 Thread 类中。而 wait() 和 notify() 方法则定义在 Object 类中,因为每个对象都有这些方法,可以在获取对象锁的情况下使用。