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

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

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薄皮牛肉大葱包子造好了!可以吃了!
吃货正在吃薄皮牛肉大葱包子
包子已经吃完
============

猜你喜欢

转载自blog.csdn.net/weixin_45966880/article/details/113763458