wait和sleep

206 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第14天,点击查看活动详情

大家好,我是尚影嫣🌷,一名Java后端程序媛。如果您喜欢我的文章,欢迎点赞➕关注❤️,让我们一起成为更好的我们~🥰

sleep和wait的区别是面试中一个非常常见的问题,虽然sleep和wait都能使线程处于阻塞状态,但却有着本质上的区别。

主要区别有四个:

  1. sleep是线程Thread类的方法,而wait是Object类中的方法。
  2. sleep方法不会释放lock,而wait会释放,并加入到等待队列中。
  3. sleep方法不依赖于synchronized,而wait依赖synchronized。
  4. sleep不需要被唤醒,而wait需要被唤醒。

下面我们就根据这四个区别来分析。

一、sleep是线程Thread的方法,wait是Object的方法。

sleep方法属于Thread类中的静态方法,wait属于Object的成员方法。首先进入到Thread的源码,ctrl+O查看方法列表。我们输入s就可以查看所有以s开头的方法了。

public class WaitSleepDemo {
    public static void main(String[] args) throws InterruptedException {
        Object lock=new Object();
        Thread t1 = new Thread(() -> {
            synchronized (lock) {
                System.out.println("线程1:开始执行");
                try {
                    lock.wait(0);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("线程1:结束执行");
            }
            System.out.println("线程1:终止执行");
        });
        t1.start();
        Thread.sleep(100);
        System.out.println("执行线程1的终止方法");
        t1.interrupt();
 
        Thread t2=new Thread(()-> {
            System.out.println("线程2:开始执行");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("线程2:结束执行");
        });
        t2.start();
        
        Thread.sleep(100);
        System.out.println("执行线程2的终止方法");
        t2.interrupt();
    }
}

二、sleep不释放lock,wait会释放。

主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。

三、sleep不依赖同步方法,wait需要。

sleep()方法可以在任何地方使用,wait()方法只能在synchronized方法或synchronized块中使用。

四、sleep不需要被唤醒,wait需要。

sleep方法很简单,我们主要关注wait方法。

首先我们定义两个方法,一个等待方法,一个唤醒方法。