问答题991/1053sleep() 方法和 wait() 方法的区别和共同点?

难度:
2021-11-02 创建

参考答案:

sleep()wait() 方法都用于使当前线程暂停执行,但它们的用途、行为和应用场景有显著不同。下面详细介绍它们的 区别共同点

1. 共同点

  • 线程的暂停:两者都会使当前线程进入休眠状态,暂时停止执行,直到满足一定的条件后才会恢复执行。
  • 时间控制sleep()wait() 都可以指定暂停的时间(单位为毫秒或纳秒)。如果没有指定时间,线程会在某个条件下被阻塞,直到被唤醒。

2. 区别

特性sleep()wait()
定义和使用场景Thread.sleep()Thread 类的方法,用于暂停当前线程的执行。一般用于控制线程的时间间隔。Object.wait()Object 类的方法,用于线程间的协作。通常用于线程之间的通信或同步,常用于同步代码块或同步方法内。
锁的要求sleep() 方法不涉及任何锁定,不需要持有锁,也不会释放任何锁。wait() 方法必须在同步块或同步方法内调用,调用时需要持有对象锁,并且会释放锁。
唤醒方式线程会在指定时间后自动唤醒,或者由其他线程调用 interrupt() 唤醒。线程在调用 wait() 后,会被其他线程通过 notify()notifyAll() 唤醒,或者被 interrupt() 唤醒。
异常处理sleep() 会抛出 InterruptedException,需要捕获或声明。wait() 也会抛出 InterruptedException,需要捕获或声明。
阻塞方式线程进入睡眠状态,不释放占用的资源(如锁),直到时间到或被中断。线程进入等待状态,释放当前持有的锁,直到被唤醒。
暂停时间可以指定暂停的时间,线程会暂停指定的时间,无论外部条件如何。线程会进入等待状态,直到满足条件被唤醒,暂停时间是不确定的。

3. 详细说明

3.1 sleep() 方法

  • 功能:使当前线程暂停指定的时间。

  • 特点

    • sleep() 使当前线程“休眠”,但线程的锁不会被释放,其他线程无法进入被 sleep() 线程同步的代码段。
    • 线程睡眠后,系统会让出 CPU 时间片,直到指定时间结束或被中断。
    • 适用于延时任务或控制线程执行的时间间隔。

    示例

    1try { 2 Thread.sleep(1000); // 休眠 1000 毫秒 3} catch (InterruptedException e) { 4 e.printStackTrace(); 5}

3.2 wait() 方法

  • 功能:使当前线程进入等待队列,直到被其他线程通过 notify()notifyAll() 唤醒。

  • 特点

    • wait() 必须在同步代码块或同步方法中调用,因为它需要持有对象锁。
    • 调用 wait() 后,线程会释放对象的锁,进入“等待”状态,直到其他线程调用 notify()notifyAll() 唤醒它。
    • wait() 方法通常用于线程间的协调或同步,确保某个条件满足后才继续执行。

    示例

    1synchronized (obj) { 2 try { 3 obj.wait(); // 线程进入等待状态 4 } catch (InterruptedException e) { 5 e.printStackTrace(); 6 } 7}

4. 应用场景

  • sleep() 方法的应用场景

    • 控制线程的执行间隔,防止 CPU 占用过高。
    • 模拟任务的延时,或者定时任务。
    • 在某些情况下,sleep() 可用来实现某种形式的轮询或等待。
  • wait() 方法的应用场景

    • 用于线程之间的通信或协作。例如,一个线程等待另一个线程完成某个任务后再继续执行。
    • 在生产者-消费者模式中,消费者线程调用 wait() 等待生产者生产数据,生产者线程调用 notify() 唤醒消费者线程。
    • 解决线程同步问题,确保多线程之间按照特定顺序执行。

最近更新时间:2024-12-06