Skip to content

wait()和sleep()的区别?

  • 所属类:

    • wait() 是定义在 Object 类中的方法
    • sleep() 是定义在 Thread 类中的方法
  • 唤醒机制:

    • wait() 需要通过调用同一个对象的 notify() 或者 notifyAll() 方法来手动唤醒被等待的线程
    • sleep() 则是在指定的时间过后,自动恢复执行
  • 使用场景:

    • wait(): 主要用于线程间的协作通信。例如,在生产者消费者模式中,当没有数据时,消费者线程可以调用 wait() 等待通知
    • sleep(): 主要用于当前线程的暂停执行,通常在需要让出 CPU 时间片或者等待某个事件发生时使用
  • 锁的状态:

    • wait(): 在调用 wait() 方法时,会释放对象锁(monitor),直到被唤醒才会重新获取该锁
    • sleep(): 不会释放任何对象锁。当前线程在睡眠期间仍然持有所有同步锁定的资源

实际可运行代码示例:

java
public class WaitSleepExample {
    public static void main(String[] args) {
        // 创建一个共享的对象
        final Object lock = new Object();
        
        Runnable task1 = () -> {
            synchronized (lock) {
                System.out.println("Thread 1: 开始等待");
                try {
                    lock.wait(); // 线程1进入wait状态,并释放锁
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
                System.out.println("Thread 1: 被唤醒,继续执行");
            }
        };
        
        Runnable task2 = () -> {
            synchronized (lock) {
                System.out.println("Thread 2: 唤醒线程1");
                lock.notify(); // 唤醒被wait的线程
            }
        };
        
        Thread thread1 = new Thread(task1);
        Thread thread2 = new Thread(task2);
        
        thread1.start();
        try {
            // 确保线程1已经启动并进入等待状态
            Thread.sleep(500);
        } catch (InterruptedException e) {
            System.out.println("主线程被中断");
        }
        
        thread2.start(); // 启动线程2,唤醒线程1
        
        Runnable sleepTask = () -> {
            try {
                Thread.sleep(1000); // 线程暂停执行
                System.out.println("Thread 3: 停止了1秒");
            } catch (InterruptedException e) {
                System.out.println("Thread 3 被中断");
            }
        };
        
        Thread thread3 = new Thread(sleepTask);
        thread3.start();
    }
}

输出示例:

Thread 1: 开始等待
Thread 2: 唤醒线程1
Thread 1: 被唤醒,继续执行
Thread 3: 停止了1秒