java中sleep()和wait()暂停线程的区别
1. Thread.sleep()
- 所属类:它是
Thread
类的静态方法。 - 作用:让当前正在执行的线程暂停指定的时间,在暂停期间,线程会一直持有对象锁(也就是
synchronized
锁)。 - 中断响应:当线程处于
sleep()
状态时,如果被其他线程中断(调用interrupt()
方法),线程会立刻抛出InterruptedException
,同时会清除中断状态。 - 代码示例:
public class SleepTest {public static void main(String[] args) {Thread t = new Thread(() -> {try {System.out.println("线程开始休眠");Thread.sleep(5000); // 休眠5秒System.out.println("线程休眠结束");} catch (InterruptedException e) {System.out.println("线程休眠被中断: " + e.getMessage());Thread.currentThread().interrupt(); // 重新设置中断状态}});t.start();// 2秒后中断线程try {System.out.println("主线程休眠");Thread.sleep(2000);} catch (InterruptedException e) {}t.interrupt();} }
- 输出结果:
主线程休眠 线程开始休眠 线程休眠被中断: sleep interrupted
2. Object.wait()
- 所属类:它是
Object
类的实例方法。 - 作用:使当前线程释放对象锁,并进入该对象的等待池,直到其他线程调用相同对象的
notify()
或notifyAll()
方法。 - 中断响应:当线程处于
wait()
状态时,如果被其他线程中断,线程会立刻抛出InterruptedException
,同时会释放对象锁并清除中断状态。 - 代码示例:
public class WaitTest {private static final Object lock = new Object();public static void main(String[] args) {Thread t = new Thread(() -> {synchronized (lock) {try {System.out.println("线程开始等待");lock.wait(); // 等待其他线程唤醒System.out.println("线程等待结束");} catch (InterruptedException e) {System.out.println("线程等待被中断: " + e.getMessage());Thread.currentThread().interrupt(); // 重新设置中断状态}}});t.start();// 2秒后中断线程try {System.out.println("主线程休眠");Thread.sleep(2000);} catch (InterruptedException e) {}t.interrupt();}}
- 输出结果:
主线程休眠 线程开始等待 线程等待被中断: wait interrupted
3. 核心区别
对比项 | Thread.sleep() | Object.wait() |
---|---|---|
锁的释放 | 不释放对象锁 | 释放对象锁 |
唤醒方式 | 时间结束自动唤醒或被中断 | 必须由其他线程调用notify() /notifyAll() 唤醒或被中断 |
使用场景 | 线程暂时休眠 | 线程间的协作与通信 |
同步块要求 | 不需要在synchronized 块中调用 | 必须在synchronized 块中调用 |
4. 注意事项
- 中断处理:一旦捕获到
InterruptedException
,要根据实际需求处理中断,比如终止线程或者恢复执行。 - 锁的管理:
wait()
在释放锁后,需要重新获取锁才能继续执行后续代码。 - 线程状态:
sleep()
会使线程进入TIMED_WAITING
状态,而wait()
可能让线程进入WAITING
或TIMED_WAITING
状态。
总之,sleep()
主要用于线程的短暂暂停,不释放对象锁,而wait()
则用于线程间的交互,会释放对象锁。在中断处理方面,两者都会抛出异常,但wait()
还会释放对象锁。