Wait与Sleep的区别
1、
sleep 会暂停当前线程, 但是不会释放锁。
wait 也会暂停当前线程, 但是会释放锁。
2、
sleep 是Thread类中的方法。Thread.sleep(1000);
wait 是Object类中的方法。
也就是说所有的对象其实都是有 wait 方法的。new Object().wait();
而 sleep 方法只是表示当前线程暂停执行,只能用于 Thread 中。
那为什么这样设计呢?
原因在于,因为锁其实可以是任意的对象(锁就是监视器Monitor)。那么等待和唤醒是基于同一把锁的,也就是同一个对象的。
Object lock = new Object();
synchronized (lock){
lock.wait();
lock.notify();
}
3、
sleep 方法可以再任意场景下使用。
wait 方法是只能在同步块中使用,用在其他地方会报错。
4、
sleep 方法只能在睡够时间后才能醒。
wait 方法可以随时被唤醒。
举个栗子:
public static void main(String[] args) {
Object lock = new Object();
new Thread(()->{
synchronized (lock){
System.out.println("厕所没有纸了。。。");
try {
System.out.println("先思考一会儿怎么会没纸了。。。");
Thread.sleep(10000);
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("完事走人。。。");
}
}).start();
new Thread(()->{
synchronized (lock){
System.out.println("买纸。。。");
System.out.println("送纸。。。");
lock.notify();
}
}).start();
}