参考答案:
sleep() 和 wait() 方法都用于使当前线程暂停执行,但它们的用途、行为和应用场景有显著不同。下面详细介绍它们的 区别 和 共同点。
sleep() 和 wait() 都可以指定暂停的时间(单位为毫秒或纳秒)。如果没有指定时间,线程会在某个条件下被阻塞,直到被唤醒。| 特性 | sleep() | wait() |
|---|---|---|
| 定义和使用场景 | Thread.sleep() 是 Thread 类的方法,用于暂停当前线程的执行。一般用于控制线程的时间间隔。 | Object.wait() 是 Object 类的方法,用于线程间的协作。通常用于线程之间的通信或同步,常用于同步代码块或同步方法内。 |
| 锁的要求 | sleep() 方法不涉及任何锁定,不需要持有锁,也不会释放任何锁。 | wait() 方法必须在同步块或同步方法内调用,调用时需要持有对象锁,并且会释放锁。 |
| 唤醒方式 | 线程会在指定时间后自动唤醒,或者由其他线程调用 interrupt() 唤醒。 | 线程在调用 wait() 后,会被其他线程通过 notify() 或 notifyAll() 唤醒,或者被 interrupt() 唤醒。 |
| 异常处理 | sleep() 会抛出 InterruptedException,需要捕获或声明。 | wait() 也会抛出 InterruptedException,需要捕获或声明。 |
| 阻塞方式 | 线程进入睡眠状态,不释放占用的资源(如锁),直到时间到或被中断。 | 线程进入等待状态,释放当前持有的锁,直到被唤醒。 |
| 暂停时间 | 可以指定暂停的时间,线程会暂停指定的时间,无论外部条件如何。 | 线程会进入等待状态,直到满足条件被唤醒,暂停时间是不确定的。 |
sleep() 方法功能:使当前线程暂停指定的时间。
特点:
sleep() 使当前线程“休眠”,但线程的锁不会被释放,其他线程无法进入被 sleep() 线程同步的代码段。示例:
1try { 2 Thread.sleep(1000); // 休眠 1000 毫秒 3} catch (InterruptedException e) { 4 e.printStackTrace(); 5}
wait() 方法功能:使当前线程进入等待队列,直到被其他线程通过 notify() 或 notifyAll() 唤醒。
特点:
wait() 必须在同步代码块或同步方法中调用,因为它需要持有对象锁。wait() 后,线程会释放对象的锁,进入“等待”状态,直到其他线程调用 notify() 或 notifyAll() 唤醒它。wait() 方法通常用于线程间的协调或同步,确保某个条件满足后才继续执行。示例:
1synchronized (obj) { 2 try { 3 obj.wait(); // 线程进入等待状态 4 } catch (InterruptedException e) { 5 e.printStackTrace(); 6 } 7}
sleep() 方法的应用场景:
sleep() 可用来实现某种形式的轮询或等待。wait() 方法的应用场景:
wait() 等待生产者生产数据,生产者线程调用 notify() 唤醒消费者线程。最近更新时间:2024-12-06