Java 线程中的 wait、notify 和 notifyAll 解析
Java 中的线程有六种状态,具体可以查看我之前的文章:https://xie.infoq.cn/article/873a38a88ac00594a1998c965。本文主要讲其中的部分状态切换。
等待唤醒案例:线程间的通信
顾客去包子铺买包子,告知老板自身需求后,进入等待(调用 wait()方法)老板处理的过程,此时顾客的状态为 WAITING,老板做好包子后,告知(调用 notify()方法)顾客包子做好了。💡线程间的通信的主要思想是生产者消费者机制。
代码实现
思路如下:
创建一个顾客线程(消费者):告知老板要的包子的种类和数量,调用 wait 方法,放弃 CPU 的执行,进入到 WAITING 状态(无限等待)
创建一个老板线程(生产者):花了 5 秒做包子,做好包子之后,调用 notify 方法,唤醒顾客吃包子。
代码如下:定义一个锁对象:
创建一个顾客线程(消费者):
创建一个老板线程(生产者):
输出如下:
顾客告知老板要的包子的种类和数量
老板 5 秒钟之后做好包子,告知顾客,可以吃包子了
包子已经做好了,开吃!
---------------------------------------
顾客告知老板要的包子的种类和数量
老板 5 秒钟之后做好包子,告知顾客,可以吃包子了
包子已经做好了,开吃!
---------------------------------------
💡注意:顾客和老板线程必须使用同步代码块包裹起来,保证等待和唤醒只能有一个在执行同步使用的锁对象必须保证唯一只有锁对象才能调用 wait 和 notify 方法。
扩展:Object 类中 wait 带参方法和 notifyAll 方法
进入到 TimeWaiting(计时等待)有两种方式
使用 sleep(long m)方法,在毫秒值结束之后,线程睡醒进入到 Runnable/Blocked 状态
使用 wait(long m)方法,wait 方法如果在毫秒值结束之后,还没有被 notify 唤醒,就会自动醒来,线程睡醒进入到 Runnable/Blocked 状态
唤醒的方法:
void notify() 唤醒在此对象监视器上等待的单个线程。
void notifyAll() 唤醒在此对象监视器上等待的所有线程。
本文内容到此结束了,
如有收获欢迎点赞👍收藏💖关注✔️,您的鼓励是我最大的动力。
如有错误❌疑问💬欢迎各位大佬指出。
保持热爱,奔赴下一场山海。🏃🏃🏃
版权声明: 本文为 InfoQ 作者【共饮一杯无】的原创文章。
原文链接:【http://xie.infoq.cn/article/5e42191f8218e7776c0ed1fcd】。文章转载请联系作者。
评论