多线程-等待唤醒-包子案例演示
等待唤醒案例
消费者和生产者
需求
包子铺线程生产包子 吃货线程消费包子 当包子没有时 吃货线程等待 包子铺线程生产包子 并通知吃货线程 因为已经由包子了 那么包子铺进入等待状态
接下来 吃货线程能否进一步执行则取决于锁的获取情况 如果吃货获取到锁 那么就执行吃包子动作 包子吃完 并通知包子铺 吃货线程进入等待 包子铺线程能否进一步执行则取决于锁的获取情况
案例代码:
包子类:
public class BaoZi { //包子皮 String pi; //包子陷 String xian; //包子的状态:有true 没有false 设置初始值为false没有包子 boolean flag=false; }
包子铺:
public class BaoZiPu extends Thread { //将包子类做完成员变量传入到包子铺 private BaoZi bz; //创建构造方法 public BaoZiPu(BaoZi bz) { this.bz = bz; } //重写父类的方法 @Override public void run() { //定义一个变量 int count=0; //让包子一直生产 while (true){ //同步锁 synchronized (bz){ //对包子的状态进行判断 if (bz.flag==true){ //包子铺调用wait方法进入等待状态 try { bz.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } //被唤醒的包子 交替生产两种包子 if (count%2==0){ //生产薄皮三鲜陷包子 bz.pi="薄皮"; bz.xian="三鲜陷"; }else{ //生产冰皮牛肉大葱陷 bz.pi="冰皮"; bz.xian="牛肉大葱陷"; } count++; System.out.println("包子铺正在生产:"+bz.pi+bz.xian+"包子"); //生产包子需要3秒 try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } //包子铺生产好了包 bz.flag=true; bz.notify(); System.out.println("包子铺已经生产好了:"+bz.pi+bz.xian+"包子,吃货可以开始吃了"); } } } }
吃货类:
public class ChiHou extends Thread { private BaoZi bz; public ChiHou(BaoZi bz) { this.bz = bz; } //设置线程任务 @Override public void run() { //使用死循环 让吃货一直吃包子 while (true) { //设置同步锁 synchronized (bz) { //对包子的状态进行判断 if (bz.flag == false) { //吃货调用wait方法进入等待状态 try { bz.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } //被唤醒之后执行的代码 吃包子 System.out.println("吃货正在吃" + bz.pi + bz.xian + "的包子"); //修改包子的状态 bz.flag = false; //通知生产包子 bz.notify(); System.out.println("吃货已经吃" + bz.pi + bz.xian + "的包子,厂家正在生产"); System.out.println("------------------------------"); } } } }
测试类:
public class test { public static void main(String[] args) { BaoZi baoZi = new BaoZi(); new BaoZiPu(baoZi).start(); new ChiHou(baoZi).start(); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本