MST

星途 面试题库

面试题:Java并发框架中sleep和wait方法的应用场景对比

在Java的并发框架(如java.util.concurrent包下的相关类和接口)中,sleep和wait方法各自适用于哪些典型场景?请举例说明,并分析为什么在这些场景下选择使用其中一个方法而不是另一个,阐述它们在复杂并发编程环境中的优劣势。
18.1万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

sleep方法

  1. 适用场景
    • 线程暂停执行:当需要让当前线程暂停一段时间,不参与CPU调度,但不释放锁资源时使用。例如,模拟一些定时任务,在任务执行间隔需要暂停线程。
    • 降低CPU使用率:在循环执行任务且不需要线程一直占用CPU资源的场景下,通过调用Thread.sleep方法,让线程进入睡眠状态,减少CPU资源的消耗。
  2. 示例
public class SleepExample {
    public static void main(String[] args) {
        Thread thread = new Thread(() -> {
            for (int i = 0; i < 5; i++) {
                System.out.println("Thread is running: " + i);
                try {
                    Thread.sleep(1000); // 线程暂停1秒
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        thread.start();
    }
}
  1. 优势
    • 简单易用:直接调用Thread.sleep方法即可暂停当前线程,使用方便。
    • 不释放锁:如果线程持有锁,调用sleep方法时不会释放锁,适合在需要保持锁状态下暂停线程的场景。
  2. 劣势
    • 无法响应中断:如果在sleep期间线程被中断,sleep方法会抛出InterruptedException异常,需要在捕获异常后处理中断逻辑,增加了代码复杂度。
    • 不能用于线程间通信sleep方法主要用于线程自身的暂停,不能用于线程间的协作和通信。

wait方法

  1. 适用场景
    • 线程间协作:在多线程协作场景中,当一个线程需要等待某个条件满足后才能继续执行时使用。例如,生产者 - 消费者模型中,消费者线程需要等待生产者线程生产出数据后才能消费。
    • 资源共享与同步:当多个线程共享资源,并且需要根据资源状态进行同步时,wait方法可以让线程等待资源可用。
  2. 示例
public class WaitNotifyExample {
    private static final Object lock = new Object();
    private static boolean hasDataToProcess = false;

    public static void main(String[] args) {
        Thread producerThread = new Thread(() -> {
            synchronized (lock) {
                System.out.println("Producer: Producing data...");
                hasDataToProcess = true;
                lock.notify(); // 唤醒等待在lock上的线程
            }
        });

        Thread consumerThread = new Thread(() -> {
            synchronized (lock) {
                while (!hasDataToProcess) {
                    try {
                        lock.wait(); // 线程等待,释放lock锁
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println("Consumer: Consuming data...");
            }
        });

        consumerThread.start();
        producerThread.start();
    }
}
  1. 优势
    • 线程间通信wait方法配合notifynotifyAll方法,可以实现线程间的协作和通信,有效解决多线程同步问题。
    • 释放锁:调用wait方法时,线程会释放持有的锁,允许其他线程获取锁并执行,提高了资源的利用率。
  2. 劣势
    • 必须在同步块中使用wait方法必须在synchronized块中调用,否则会抛出IllegalMonitorStateException异常,限制了其使用场景。
    • 复杂的同步逻辑:使用wait方法需要正确处理同步块、锁的获取和释放,以及线程间的通知机制,代码复杂度较高。