个人技术分享

特性 wait() sleep()
所在类和定义 Object类中的实例方法 Thread类中的静态方法
释放锁 是,调用wait()会释放当前持有的对象锁 否,调用sleep()不会释放任何锁
使用场景 线程间通信,通常与notify()notifyAll()配合使用 让线程暂停执行一段时间,通常用于模拟延迟或调度任务
唤醒机制 依赖其他线程调用notify()notifyAll() 自动唤醒,经过指定时间后继续执行
抛出的异常 InterruptedExceptionIllegalMonitorStateException InterruptedException
必须在同步块中调用 是,必须在synchronized块中调用 否,不需要在synchronized块中调用

示例代码

wait() 示例代码

public class WaitExample {
    private static final Object lock = new Object();

    public static void main(String[] args) {
        Thread thread1 = new Thread(() -> {
            synchronized (lock) {
                try {
                    System.out.println("Thread 1 is waiting.");
                    lock.wait();
                    System.out.println("Thread 1 is resumed.");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        Thread thread2 = new Thread(() -> {
            synchronized (lock) {
                try {
                    Thread.sleep(2000);
                    System.out.println("Thread 2 is notifying.");
                    lock.notify();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        thread1.start();
        thread2.start();
    }
}

sleep() 示例代码

public class SleepExample {
    public static void main(String[] args) {
        Thread thread = new Thread(() -> {
            try {
                System.out.println("Thread is sleeping for 2 seconds.");
                Thread.sleep(2000);
                System.out.println("Thread is awake.");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        thread.start();
    }
}