标签:并发 释放 生产者 代码块 sys 线程之间的通信 except 时间 数据
package demo01; public class baoZi { String pi ; String xian ; boolean flag = false ;//包子资源 是否存在 包子资源状态 }
package demo01; public class BaoZiPu extends Thread { //需要在成员变量位置创建一个包子变量 private baoZi bz; //使用带参数构造,为变量赋值 public BaoZiPu(String name, baoZi bz) { super(name); this.bz = bz; } //设置线程任务,生产包子 @Override public void run() { int count = 0; while (true) { //同步 synchronized (bz) { if (bz.flag == true) {//包子资源 存在 try { //线程进入等待时间 bz.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } // 没有包子 造包子 System.out.println("包子铺开始做包子"); if (count % 2 == 0) { // 冰皮 五仁 bz.pi = "冰皮"; bz.xian = "五仁"; } else { // 薄皮 牛肉大葱 bz.pi = "薄皮"; bz.xian = "牛肉大葱"; } count++; try { //5秒时间生产包子 Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } //生产好了修改状态 bz.flag = true; System.out.println("包子造好了:" + bz.pi + bz.xian); System.out.println("吃货来吃吧"); //唤醒等待线程 (吃货) bz.notify(); } } } }
package demo01; public class Eat extends Thread { private baoZi bz; public Eat(String name, baoZi bz) { super(name); this.bz = bz; } @Override public void run() { while (true) { synchronized (bz) { if (bz.flag == true) { System.out.println("我在吃包子"); //3秒吃完 try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("我吃完了"); //吃完了 修改包子状态 bz.flag = false; //吃完了,唤醒做包子的线程 bz.notify(); System.out.println("快去做包子"); } } } } }
测试类
package demo01; public class Eat extends Thread { private baoZi bz; public Eat(String name, baoZi bz) { super(name); this.bz = bz; } @Override public void run() { while (true) { synchronized (bz) { if (bz.flag == true) { System.out.println("我在吃包子"); //3秒吃完 try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("我吃完了"); //吃完了 修改包子状态 bz.flag = false; //吃完了,唤醒做包子的线程 bz.notify(); System.out.println("快去做包子"); } } } } }
执行结果
包子铺开始做包子
包子造好了:冰皮五仁
吃货来吃吧
我在吃包子
我吃完了
快去做包子
包子铺开始做包子
标签:并发 释放 生产者 代码块 sys 线程之间的通信 except 时间 数据
原文地址:https://www.cnblogs.com/wurengen/p/10929821.html