谈谈 wait 和 notify
目录
1 wait()方法
2 notify()⽅法
3 wait 和 sleep 的区别
多线程调度是随机的, 很多时候希望多个线程能够按照咱们规定的顺序来执行. 完成线程之间的配合工作. wait和notify就是一个用来协调线程顺序的重要工具. 这俩方法都是 Object 提供的方法.
随便找个对象,都可以使用wait和notify.
1 wait()方法
上述代码会抛下面的异常.
wait要解锁, 前提就是先能加上锁. 锁都没加, 谈何解锁呢?
那这样思路就明朗了, 先加锁, 在synchronized里头再进行wait!!
public class Demo14 {
public static void main(String[] args) throws InterruptedException {
Object object = new Object();
synchronized (object) {
object.wait();
}
System.out.println("wait 结束");
}
}
通过jconsole可以看到main线程就进入堵塞状态了.
2 notify()⽅法
notify ⽅法是唤醒等待的线程.
如果有N个线程等待,则有线程调度器随机挑选出⼀个呈 wait 状态的线程。(并没有 "先来后到")
在notify()⽅法后,当前线程不会⻢上释放该对象锁,要等到执⾏notify()⽅法的线程将程序执⾏ 完,也就是退出同步代码块之后才会释放对象锁.
notifyAll 唤醒全部处于waiting 中的线程, 但是用起来不是特别好.
public class Demo15 {
// 使用这个锁对象来负责加锁, wait, notify
private static Object locker = new Object();
public static void main(String[] args) {
Thread t1 = new Thread(() -> {
while (true) {
synchronized (locker) {
System.out.println("t1 wait 开始");
try {
locker.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("t1 wait 结束");
}
}
});
t1.start();
Thread t2 = new Thread(() -> {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (locker) {
System.out.println("t2 notify 开始");
locker.notify();
System.out.println("t2 notify 结束");
}
}
});
t2.start();
}
}
3 wait 和 sleep 的区别