持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第14天,点击查看活动详情
大家好,我是尚影嫣🌷,一名Java后端程序媛。如果您喜欢我的文章,欢迎点赞➕关注❤️,让我们一起成为更好的我们~🥰
sleep和wait的区别是面试中一个非常常见的问题,虽然sleep和wait都能使线程处于阻塞状态,但却有着本质上的区别。
主要区别有四个:
- sleep是线程Thread类的方法,而wait是Object类中的方法。
- sleep方法不会释放lock,而wait会释放,并加入到等待队列中。
- sleep方法不依赖于synchronized,而wait依赖synchronized。
- 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方法。
首先我们定义两个方法,一个等待方法,一个唤醒方法。