关于政府网站建设北京百度推广电话
目录
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, notifyprivate 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 的区别