在 Java 中,wait() 方法与 sleep() 方法有哪些不同?请从所属类、锁的释放、使用场景以及异常处理等方面进行说明。
考察说明
考查对 Java 并发编程中线程控制基础方法的理解与区分。
回答思路
- 【回答框架 1】wait() 是 Object 类的方法,必须在 synchronized 同步块或方法中调用,调用后线程会释放对象的监视器锁,并进入等待状态,直到其他线程调用同一对象的 notify() 或 notifyAll() 方法唤醒。
- 【回答框架 2】sleep() 是 Thread 类的静态方法,调用后线程进入休眠状态,但不会释放任何锁,休眠时间结束后自动恢复运行,不需要在同步上下文中调用。
- 【回答框架 3】wait() 通常用于线程间协作,实现生产者-消费者等模式,需要配合锁和通知机制;sleep() 常用于模拟耗时操作或控制执行节奏,不涉及线程间通信。
- 【回答框架 4】异常处理方面,两者都会抛出 InterruptedException,但 wait() 还要求调用者持有锁,否则抛出 IllegalMonitorStateException;sleep() 则无此要求。
- 【回答框架 5】使用 wait() 时需注意虚假唤醒,建议在循环中检查条件;sleep() 则相对简单,但需注意休眠时间精度受系统调度影响。
- 【关键点 1】wait() 属于 Object 类,sleep() 属于 Thread 类。
- 【关键点 2】wait() 释放锁,sleep() 不释放锁。
- 【关键点 3】wait() 必须在同步块中调用,sleep() 无此限制。
- 【关键点 4】wait() 用于线程间协作,sleep() 用于暂停执行。
- 【关键点 5】两者都会抛出 InterruptedException。
- 【易错点 1】误以为 sleep() 会释放锁,导致死锁或资源占用问题。
- 【易错点 2】在非同步上下文中调用 wait() 会抛出 IllegalMonitorStateException。
- 【易错点 3】忽略虚假唤醒,未在循环中检查等待条件。