标签:进一步 com ace rri ati 完成 其它 pre notifyall
/* 包子铺线程生产包子,吃货线程消费包子。当包子没有时(包子状态为false),吃货线程等待,包子铺线程生产包子 (即包子状态为true),并通知吃货线程(解除吃货的等待状态),因为已经有包子了,那么包子铺线程进入等待状态。 接下来,吃货线程能否进一步执行则取决于锁的获取情况。如果吃货获取到锁,那么就执行吃包子动作,包子吃完(包 子状态为false),并通知包子铺线程(解除包子铺的等待状态),吃货线程进入等待。包子铺线程能否进一步执行则取 决于锁的获取情况 */
代码实现
包子类
package demo01; public class BaoZi { String pier; String xianer; boolean flag = false;//包子资源 是否存在 包子资源状态 }
package demo01; public class ChiHuo extends Thread { private BaoZi bz; public ChiHuo(String name, BaoZi bz) { super(name); this.bz = bz; } @Override public void run() { while (true) { synchronized (bz) { if (bz.flag == false) {//没包子 try { bz.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("吃货正在吃" + bz.pier + bz.xianer + "包子"); bz.flag = false; bz.notify(); } } } }
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.pier = "冰皮"; bz.xianer = "五仁"; } else { // 薄皮 牛肉大葱 bz.pier = "薄皮"; bz.xianer = "牛肉大葱"; } count++; bz.flag = true; System.out.println("包子造好了:" + bz.pier + bz.xianer); System.out.println("吃货来吃吧"); //唤醒等待线程 (吃货) bz.notify(); } } } }
package demo01; public class Demo { public static void main(String[] args) { //等待唤醒案例 BaoZi bz = new BaoZi(); ChiHuo ch = new ChiHuo("吃货",bz); BaoZiPu bzp = new BaoZiPu("包子铺",bz); ch.start(); bzp.start(); } }
标签:进一步 com ace rri ati 完成 其它 pre notifyall
原文地址:https://www.cnblogs.com/wurengen/p/12053880.html