谈谈wait和notify
- 软件开发
- 2025-09-04 07:48:01

目录
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 的区别
谈谈wait和notify由讯客互联软件开发栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“谈谈wait和notify”