等待唤醒机制代码实现
包子类:
public class BaoZi { String pi; String xian; boolean flag = false; }
包子铺类:
public class BaoZiPu extends Thread{ private BaoZi bz; public BaoZiPu(BaoZi bz) { this.bz = bz; } //设置线程任务(run):吃包子 @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+"包子"); try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } //包子铺生产好了包子,修改包子的状态为true bz.flag = true; //唤醒吃货线程,让吃货线程吃包子 bz.notify(); System.out.println("包子已经生产好了"+bz.pi+bz.xian+"可以开吃了"); } } } }
吃货类:
public class ChiHuo extends Thread{ private BaoZi bz; public ChiHuo(BaoZi bz) { this.bz = bz; } //设置线程任务(run):吃包子 @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+"的"); //吃货吃完包字修改包子的状态为false bz.flag = false; //吃货唤醒包子铺线程,生产包子 bz.notify(); System.out.println("吃货已经把"+bz.pi+bz.xian+"的包子吃完了,包子铺开始生产包子"); System.out.println("================"); } } } }
测试类:
public class Demo { public static void main(String[] args) { BaoZi bz = new BaoZi(); new BaoZiPu(bz).start(); new ChiHuo(bz).start(); } }
运行结果:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix