🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# Java 中 `sleep()`和`wait()`之间的区别 > 原文: [https://howtodoinjava.com/java/multi-threading/sleep-vs-wait/](https://howtodoinjava.com/java/multi-threading/sleep-vs-wait/) 了解 Java 中`sleep()`和`wait()`方法之间的**区别**。 了解何时使用哪种方法以及 [Java 并发](https://howtodoinjava.com/java-concurrency-tutorial/)带来什么效果。 ## 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()`](https://howtodoinjava.com/java/multi-threading/wait-notify-and-notifyall-methods/) ## 2\. Java `sleep()`和`wait()` – 示例 ```java synchronized(LOCK) { Thread.sleep(1000); // LOCK is held } ``` ```java synchronized(LOCK) { LOCK.wait(); // LOCK is not held } ``` > 阅读更多: [`yield()`和`join()`之间的区别](https://howtodoinjava.com/java/multi-threading/difference-between-yield-and-join-in-threads-in-java/) ## 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 文档](https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html#sleep-long-) [`Object.wait()`方法 Java 文档](https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#wait--)