# 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--)