多线程-等待唤醒-包子案例演示
作者:互联网
等待唤醒案例
消费者和生产者
需求
包子铺线程生产包子 吃货线程消费包子 当包子没有时 吃货线程等待 包子铺线程生产包子 并通知吃货线程 因为已经由包子了 那么包子铺进入等待状态
接下来 吃货线程能否进一步执行则取决于锁的获取情况 如果吃货获取到锁 那么就执行吃包子动作 包子吃完 并通知包子铺 吃货线程进入等待 包子铺线程能否进一步执行则取决于锁的获取情况
案例代码:
包子类:
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(); } }
标签:包子铺,吃货,public,线程,演示,多线程,包子,bz 来源: https://www.cnblogs.com/aimz01/p/16469956.html