参考答案:
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