您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# Java sleep和wait怎么理解
在Java多线程编程中,`sleep()`和`wait()`是两个容易混淆但作用完全不同的方法。它们都能使线程暂停执行,但使用场景、底层机制和唤醒方式存在本质区别。本文将深入解析二者的差异,并通过代码示例说明如何正确使用。
## 一、基本概念对比
### 1. sleep()方法
- **所属类**:`java.lang.Thread`的静态方法
- **作用**:让当前线程暂停执行指定时间(不释放锁)
- **调用方式**:`Thread.sleep(long millis)`
### 2. wait()方法
- **所属类**:`java.lang.Object`的实例方法
- **作用**:使当前线程进入等待状态(释放锁),直到其他线程调用`notify()`/`notifyAll()`
- **调用方式**:`object.wait()`
## 二、核心区别详解
### 1. 锁的释放行为
```java
// sleep示例(不释放锁)
synchronized(lock) {
Thread.sleep(1000); // 线程休眠但保持锁
}
// wait示例(释放锁)
synchronized(lock) {
lock.wait(); // 线程释放锁并等待
}
特性 | sleep() | wait() |
---|---|---|
典型用途 | 定时任务、模拟延迟 | 线程间通信/协调 |
唤醒方式 | 超时自动唤醒 | 需要其他线程显式通知 |
锁状态 | 保持所有获得的锁 | 释放当前对象锁 |
两者都会抛出InterruptedException
,但处理逻辑不同:
// sleep的典型处理
try {
Thread.sleep(100);
} catch (InterruptedException e) {
Thread.currentThread().interrupt(); // 恢复中断状态
}
// wait的典型处理
synchronized(lock) {
try {
lock.wait();
} catch (InterruptedException e) {
// 通常需要重新检查等待条件
}
}
TIMED_WTING
WTING
或TIMED_WTING
// 模拟耗时操作
public void process() {
try {
// 模拟IO延迟
Thread.sleep(200);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
class Buffer {
private Queue<Integer> queue = new LinkedList<>();
private int capacity;
public synchronized void put(int value) throws InterruptedException {
while (queue.size() == capacity) {
wait(); // 缓冲区满时等待
}
queue.add(value);
notifyAll(); // 唤醒消费者
}
public synchronized int take() throws InterruptedException {
while (queue.isEmpty()) {
wait(); // 缓冲区空时等待
}
int value = queue.poll();
notifyAll(); // 唤醒生产者
return value;
}
}
wait()
// 错误示例
public void wrongWait() {
try {
obj.wait(); // 抛出IllegalMonitorStateException
} catch (InterruptedException e) {
// ...
}
}
Thread.sleep(100); // 正确
obj.sleep(100); // 错误(编译能通过但逻辑错误)
java.util.concurrent
工具类wait()
时总是配合循环条件检查Lock
和Condition
替代传统同步理解sleep()
和wait()
的关键在于:
- sleep()
是线程控制方法,wait()
是对象级的线程协调机制
- 锁的释放与否决定了它们的适用场景
- 现代Java开发中,更推荐使用java.util.concurrent
包中的高级API
正确区分和使用这两个方法,是编写健壮多线程程序的基础要求。在实际开发中,应当根据具体需求选择最合适的线程控制方式。 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。