原文: https://howtodoinjava.com/java/multi-threading/sleep-vs-wait/

了解 Java 中sleep()wait()方法之间的区别。 了解何时使用哪种方法以及 Java 并发带来什么效果。

1. Java sleep()wait() – 讨论

sleep()是一种用于暂停该过程几秒钟或我们想要的时间的方法。 但是,在使用wait()方法的情况下,线程进入等待状态,直到我们调用notify()notifyAll()时,线程才会自动返回。

主要区别在于,wait()会释放锁定或监视器,而sleep()不会在等待期间释放锁定或监视器。 通常,wait()用于线程间通信,而sleep()用于引入执行暂停。

Thread.sleep()将当前线程发送到“不可运行”状态一段时间。 该线程保留已获取的监视器 - 即,如果该线程当前在synchronized块或方法中,则没有其他线程可以进入该块或方法。 如果另一个线程调用t.interrupt()。 它将唤醒睡眠线程。

sleep()static方法,这意味着它始终会影响当前线程(正在执行sleep方法的线程)。 一个常见的错误是在t是不同线程的情况下调用t.sleep()。 即使这样,仍将休眠的是当前线程,而不是t线程。

阅读更多:使用wait()notify()

2. Java sleep()wait() – 示例

  1. synchronized(LOCK) {
  2. Thread.sleep(1000); // LOCK is held
  3. }
  1. synchronized(LOCK)
  2. {
  3. LOCK.wait(); // LOCK is not held
  4. }

阅读更多: yield()join()之间的区别

3. Java sleep()wait() – 总结

简而言之,让我们对以上所有要点进行分类以记住。

3.1 在…上调用方法

  • wait() – 调用对象; 当前线程必须在锁对象上同步。
  • sleep() – 调用线程; 始终当前正在执行的线程。

3.2 同步

  • wait() – 同步多个线程时,一个线程一个对象访问一个对象。
  • sleep() – 同步时,多个线程等待休眠线程的休眠。

3.3 锁定时间段

  • wait() – 释放其他对象有机会执行的锁定。
  • sleep() – 如果指定了超时或有人中断,请保持锁定至少 t 次。

3.4 唤醒条件

  • wait() – 直到从对象调用notify()notifyAll()
  • sleep() – 直到至少时间到期或调用interrupt()

3.5 用法

  • sleep() – 用于时间同步
  • wait() – 用于多线程同步。

希望以上信息将为您的知识库增加一些价值。

学习愉快!

Thread.sleep方法 Java 文档

Object.wait()方法 Java 文档