生产者消费者实例-吃包子

设置互斥锁包子
当没有包子时,吃货线程等待,包子铺线程运行;
当有包子时,包子铺线程等待,吃货线程运行;
分别对包子,包子铺,吃货三个类进行分析

1. 包子类
设置三个成员变量,用来表示包子属性的有皮和馅,用来形成包子铺和吃货类线程通信的有标志信息,首先设置为没有包子。
2. 包子铺类
包子铺线程继承Thread
成员变量设置包子,并通过构造方法完成包子属性的初始化
成员方法重写run:保证吃货和包子铺有一个在运行,设置synchronized代码区;
首先判断包子的状态flag,是否存在
true,调用wait()使线程阻塞
false,生产包子(这里可以调用sleep模拟,并设置包子的皮和馅)
然后修改包子的状态,释放包子这个互斥锁,使等待的吃货进程可以进行
3. 吃货类
吃货类程继承Thread
成员变量设置包子,并通过构造方法完成包子属性的初始化
成员方法重写run:保证吃货和包子铺有一个在运行,设置synchronized代码区;
首先判断包子的状态flag,是否存在
false,调用wait()使线程阻塞
true,吃包子(这里可以调用sleep模拟,打印包子的皮和馅)
然后修改包子的状态,释放包子这个互斥锁,使等待的包子铺进程可以进行

//包子
package com.itheima.demo01.WaitAndNotify;

public class BaoZi {
    String pier;
    String xianer;
    boolean flag = false;
}
//包子铺
package com.itheima.demo01.WaitAndNotify;

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) {
                    try {
                        bz.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                //没包子,生产包子
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                if (count % 2 == 0) {
                    bz.pier = "冰皮";
                    bz.xianer = "五仁";
                } else {
                    bz.pier = "薄皮";
                    bz.xianer = "牛肉大葱";
                }
                count++;
                bz.flag = true;
                System.out.println("顾客"+count+bz.pier + bz.xianer + "包子造好了!可以吃了!");
                bz.notify();
            }
        }
    }
}

//吃货
package com.itheima.demo01.WaitAndNotify;

class ChiHuo extends Thread {
    private BaoZi bz;

    ChiHuo(BaoZi bz) {
        this.bz = bz;
    }

    @Override
    public void run() {
        while (true) {
            synchronized (bz) {
                if (!bz.flag) {
                    try {
                        bz.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println("吃货正在吃" + bz.pier + bz.xianer + "包子");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                bz.flag = false;
                bz.notify();
                System.out.println("包子已经吃完");
                System.out.println("============");
            }
        }
    }
}
package com.itheima.demo01.WaitAndNotify;

public class Demo {
    public static void main(String[] args) {
        BaoZi bz=new BaoZi();
        new BaoZiPu(bz).start();
        new ChiHuo(bz).start();
    }
}

运行结果

顾客1冰皮五仁包子造好了!可以吃了!
吃货正在吃冰皮五仁包子
包子已经吃完
============
顾客2薄皮牛肉大葱包子造好了!可以吃了!
吃货正在吃薄皮牛肉大葱包子
包子已经吃完
============
顾客3冰皮五仁包子造好了!可以吃了!
吃货正在吃冰皮五仁包子
包子已经吃完
============
顾客4薄皮牛肉大葱包子造好了!可以吃了!
吃货正在吃薄皮牛肉大葱包子
包子已经吃完
============

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

绕球飞行

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值