返回

5 大区别!Java 中 sleep 方法与 wait 方法

后端

Java 中 sleep 方法和 wait 方法都是用来将线程进入休眠状态的,但它们之间存在着一些关键区别。本文将详细介绍 sleep 方法和 wait 方法的 5 大区别,帮助开发者更好地理解和使用这两个方法。

1. 锁的获取

sleep 方法不需要获取锁,而 wait 方法需要获取锁。当调用 sleep 方法时,线程会进入休眠状态,但它仍然持有锁。当调用 wait 方法时,线程会进入休眠状态,同时释放锁。

2. 中断行为

sleep 方法可以响应中断,而 wait 方法不能响应中断。当调用 sleep 方法时,如果线程被中断,它会立即从休眠状态中醒来。当调用 wait 方法时,如果线程被中断,它会继续休眠,直到被唤醒。

3. 调用位置

sleep 方法可以在任何地方调用,而 wait 方法只能在同步块或同步方法中调用。这是因为 wait 方法需要获取锁,而锁只能在同步块或同步方法中获取。

4. 唤醒条件

sleep 方法在指定的时间后自动醒来,而 wait 方法需要被其他线程唤醒。当调用 sleep 方法时,线程会在指定的时间后自动醒来。当调用 wait 方法时,线程会进入休眠状态,直到被其他线程调用 notify 或 notifyAll 方法唤醒。

5. 用途

sleep 方法通常用于让线程休眠一段时间,而 wait 方法通常用于让线程等待其他线程完成某项任务。sleep 方法可以用于实现定时任务,而 wait 方法可以用于实现线程同步。

示例代码:

public class Test {
    public static void main(String[] args) {
        // 创建一个线程对象
        Thread thread = new Thread(() -> {
            // 调用 sleep 方法
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            // 调用 wait 方法
            synchronized (Test.class) {
                try {
                    Test.class.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

            // 打印线程名称
            System.out.println(Thread.currentThread().getName());
        });

        // 启动线程
        thread.start();

        // 调用 notifyAll 方法唤醒线程
        synchronized (Test.class) {
            Test.class.notifyAll();
        }
    }
}

在上面的代码中,线程 thread 调用 sleep 方法休眠 1 秒,然后调用 wait 方法进入休眠状态。主线程调用 notifyAll 方法唤醒线程 thread,线程 thread 从休眠状态中醒来,并打印线程名称。