——————————————————————————————————————————————————————————————————————
sleep和wait区别主要在以下几点
1.调用方法
sleep是Thread类下的静态方法,wait是object下的实例方法依赖于synchronized,在JDK源码中可以查看。
2.锁的行为
线程调用sleep方法时不会释放自身所持有的锁,调用wait方法时会释放自身所持有的锁使其他线程可以获得锁。
🌰:示例一
public class state {
public static void main(String[] args) {
Object locker = new Object();
Thread t1 = new Thread(() -> {
synchronized (locker) {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
},"t1");
t1.start();
Thread t2 = new Thread(() -> {
synchronized (locker) {
System.out.println("hello");
}
},"t2");
t2.start();
}
}
🌰:示例二
public class state {
public static void main(String[] args) {
Object locker = new Object();
Thread t1 = new Thread(() -> {
synchronized (locker) {
try {
locker.wait(3000);
System.out.println("唤醒成功");
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
},"t1");
Thread t2 = new Thread(() -> {
synchronized (locker) {
System.out.println("hello");
}
locker.notify();
},"t2");
t1.start();
t2.start();
}
}
区别:
示例一中t1线程获得locker锁对象进入休眠状态,此时t2尝试获得锁t1没有释放锁,等待3s后t2线程获得锁打印hello,程序结束
示例二中t1线程获得锁进入阻塞状态,同释放锁由t2获取打印hello,通过notify唤醒t1打印后线程结束。
3.唤醒条件
由上述示例可以得出:sleep时间到后自动唤醒,wait需要等待其它线程调用notify方法唤醒。
4.使用场景
sleep不释放锁因此不适用于线程通信,主要用于控制线程执行频率、模拟延迟时间效果等。
wait主要适用于线程通信,通过拿到锁和释放锁实现线程之间的转换,大多和“notify、allnotify"搭配使用,生产者消费者模型就是典型的例子
总结:sleep和wait并没有什么可比性,一个让线程阻塞一段时间、一个作用于线程之间的通信,唯一共同点都可以让线程阻塞一段时间。