返回

深入探究 sleep() 与 wait():理解线程同步机制的差异

后端


sleep() 和 wait() 的基本概念

sleep() 方法

sleep() 方法是 Thread 类中的一个方法,它可以使当前线程进入休眠状态,在指定的时间内不执行任何代码。sleep() 方法的语法如下:

public static void sleep(long millis)
public static void sleep(long millis, int nanos)

其中,millis 参数指定线程休眠的毫秒数,nanos 参数指定线程休眠的纳秒数。如果 nanos 参数为 0,则线程将休眠指定的毫秒数;如果 nanos 参数大于 0,则线程将休眠指定的毫秒数和纳秒数。

wait() 方法

wait() 方法是 Object 类中的一个方法,它可以使当前线程进入等待状态,直到其他线程调用该对象的 notify() 或 notifyAll() 方法来唤醒它。wait() 方法的语法如下:

public final void wait()
public final void wait(long timeout)
public final void wait(long timeout, int nanos)

其中,timeout 参数指定线程等待的毫秒数,nanos 参数指定线程等待的纳秒数。如果 timeout 参数为 0,则线程将一直等待,直到其他线程调用 notify() 或 notifyAll() 方法来唤醒它;如果 timeout 参数大于 0,则线程将等待指定的毫秒数和纳秒数,如果在此期间内没有其他线程调用 notify() 或 notifyAll() 方法来唤醒它,则线程将自动从等待状态中醒来。

sleep() 和 wait() 的区别

线程状态

sleep() 方法使线程进入休眠状态,但 wait() 方法使线程进入等待状态。休眠状态是一种临时状态,线程在休眠一段时间后会自动醒来并继续执行。等待状态是一种持久状态,线程在等待状态中不会执行任何代码,只有当其他线程调用 notify() 或 notifyAll() 方法来唤醒它时,它才会从等待状态中醒来。

锁的释放

sleep() 方法不会释放锁,而 wait() 方法会释放锁。当线程调用 sleep() 方法时,它会继续持有锁,其他线程无法访问该锁。当线程调用 wait() 方法时,它会释放锁,其他线程可以访问该锁。

线程协作

sleep() 方法用于线程之间的临时协调,而 wait() 方法用于线程之间的持久协调。sleep() 方法可以使线程在一段时间内不执行任何代码,以便其他线程可以执行。wait() 方法可以使线程等待其他线程执行完成,以便自己可以继续执行。

sleep() 和 wait() 的使用场景

sleep() 的使用场景

sleep() 方法通常用于以下场景:

  • 线程需要在执行一段时间后暂停一段时间。
  • 线程需要等待其他线程执行完成。
  • 线程需要在一段时间内不执行任何代码,以便其他线程可以执行。

wait() 的使用场景

wait() 方法通常用于以下场景:

  • 线程需要等待其他线程执行完成。
  • 线程需要等待某个条件满足。
  • 线程需要等待其他线程的通知。

结论

sleep() 和 wait() 都是 Java 多线程编程中常用的方法,它们都可以在线程执行过程中实现线程的暂停,但它们之间存在着一些关键的区别。sleep() 方法使线程进入休眠状态,但 wait() 方法使线程进入等待状态。sleep() 方法不会释放锁,而 wait() 方法会释放锁。sleep() 方法用于线程之间的临时协调,而 wait() 方法用于线程之间的持久协调。