java的wait和sleep的区别
时间: 2025-01-18 20:03:07 浏览: 47
Java中的`wait()`和`sleep()`方法都是用于线程控制的方法,它们都使线程暂停执行,但它们之间存在一些显著的区别。以下是对这两个方法的详细对比:
1. **所属类**
- **`wait()`**:属于`Object`类的方法。
- **`sleep()`**:属于`Thread`类的方法。
2. **调用方式**
- **`wait()`**:必须在同步块(synchronized块)或同步方法中调用,否则会抛出`IllegalMonitorStateException`异常。
- **`sleep()`**:可以在任何地方调用,不需要在同步块或同步方法中。
3. **锁的处理机制**
- **`wait()`**:会释放当前持有的锁,让出CPU资源,并且线程进入等待状态,直到被其他线程唤醒。
- **`sleep()`**:不会释放锁,线程会一直占用CPU资源,只是暂停执行一段时间。
4. **唤醒机制**
- **`wait()`**:需要被其他线程调用`notify()`或`notifyAll()`方法唤醒。
- **`sleep()`**:时间到达后自动苏醒,不需要其他线程唤醒。
5. **用途**
- **`wait()`**:通常用于线程间通信和协作,例如生产者-消费者模型。
- **`sleep()`**:通常用于让线程暂停执行一段时间,例如模拟延迟操作。
6. **异常处理**
- **`wait()`**:可能会抛出`InterruptedException`异常,需要捕获处理。
- **`sleep()`**:同样可能抛出`InterruptedException`异常,也需要捕获处理。
7. **线程进入的状态**
- **`wait()`**:调用无参数的`wait()`方法,线程会进入`WAITING`无时限等待状态;如果指定了超时时间,则进入`TIMED_WAITING`有时限等待状态。
- **`sleep()`**:线程会进入`TIMED_WAITING`有时限等待状态。
8. **示例代码**
- **`wait()`**:
```java
public class WaitExample {
public static void main(String[] args) {
final Object lock = new Object();
Thread thread1 = new Thread(() -> {
synchronized (lock) {
try {
System.out.println("Thread 1 is waiting...");
lock.wait();
System.out.println("Thread 1 is resumed.");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
Thread thread2 = new Thread(() -> {
synchronized (lock) {
System.out.println("Thread 2 is notifying...");
lock.notify();
}
});
thread1.start();
thread2.start();
}
}
```
- **`sleep()`**:
```java
public class SleepExample {
public static void main(String[] args) {
Thread thread = new Thread(() -> {
try {
System.out.println("Thread is sleeping...");
Thread.sleep(2000); // 暂停2秒
System.out.println("Thread is resumed.");
} catch (InterruptedException e) {
e.printStackTrace();
}
});
thread.start();
}
}
阅读全文
相关推荐


















