sleep 和 wait 的区别

tip:作为程序员一定学习编程之道,一定要对代码的编写有追求,不能实现就完事了。我们应该让自己写的代码更加优雅,即使这会费时费力。

推荐:体系化学习Java(Java面试专题)

文章目录

  • 一、sleep 和 wait 的区别
  • 二、使用案例

一、sleep 和 wait 的区别

在 Java 中,线程的 “sleep” 和 “wait” 方法区别:

  1. “sleep” 方法是 Thread 类的静态方法,而 “wait” 方法是 Object 类的实例方法。

  2. “sleep” 方法会使线程进入睡眠状态,暂停执行一段时间,然后继续执行;而 “wait” 方法会使线程进入等待状态,直到其他线程调用了该对象的 “notify” 或 “notifyAll” 方法才会继续执行。

  3. “sleep” 方法不会释放线程持有的锁,而 “wait” 方法会释放线程持有的锁。

  4. “sleep” 方法通常用于在一段时间后再次执行任务,或在执行任务之前等待一段时间;而 “wait” 方法通常用于线程间的协作,比如等待其他线程的完成或等待某个条件的满足。

  5. “sleep” 方法的参数是一个时间段,而 “wait” 方法没有参数。

二、使用案例

线程 1 调用了 “sleep” 方法,暂停执行了一秒钟,然后继续执行。线程 2 调用了 “wait” 方法,进入等待状态,直到主线程调用了 lock.notify() 方法,才会继续执行。
注意,线程 2 在调用 “wait” 方法之前必须先获取 lock 对象的锁,否则会抛出 IllegalMonitorStateException 异常。

package com.pany.camp.thread;

public class SleepWait {
    public static void main(String[] args) {
        final Object lock = new Object();

        // 创建一个线程,调用 sleep 方法
        Thread thread1 = new Thread(() -> {
            System.out.println("Thread 1 started.");
            try {
                Thread.sleep(1000); // 线程睡眠 1 秒
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("Thread 1 finished.");
        });

        // 创建一个线程,调用 wait 方法
        Thread thread2 = new Thread(() -> {
            System.out.println("Thread 2 started.");
            synchronized (lock) {
                try {
                    lock.wait(); // 线程等待
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("Thread 2 finished.");
        });

        // 启动线程
        thread1.start();
        thread2.start();

        // 等待一段时间
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 唤醒线程 2
        synchronized (lock) {
            lock.notify();
        }
    }
}

你可能感兴趣的:(并发编程,java,jvm,面试)