Java(生产和消费案例)

题目

/**
 * 生产者(包子铺)是一个线程,可以继承Thread类
 * 设置线程任务run:生产包子
 * ture:有包子
 * false:没有包子
 * 包子铺生产包子
 * 两种口味的包子,交替生产
 * 包子铺生产好了包子,修改包子状态为true
 * 唤醒吃货线程,让线程吃包子
 * <p>
 * 注意:
 * 包子铺线程和包子关系--->通信(互斥)
 * 必须使用同步技术包子两个线程只有一个在执行
 * 锁对象必须包子唯一性,
 * 可以使用包子对象作为锁对象
 * 包子铺类和吃货的类就需要把包子对象作为参数残敌进来
 * 1、需要在成员位置创建一个包子的变量
 * 2、使用带参构造方法,为包子变量赋值
 */

包子铺类

public class baoZiPu extends Thread {
    // 1、需要在成员位置创建一个包子的变量
    private Baozi bz;

    //2、使用带参构造方法,为包子变量赋值
    public baoZiPu(Baozi bz) {
        this.bz = bz;
    }

    //设置线程任务run:生产包子
    @Override
    public void run() {

        //定义一个变量
        int count = 0;

        //让包子铺一直生产包子
        while (true) {

            //必须使用同步技术包子两个线程只有一个在执行
            synchronized (bz) {
                if (bz.blag == true) {
                    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 + "包子");
                //生产包子需要时间
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //包子铺生产好了包子 ,包子状态为true
                bz.blag = true;
                //唤醒吃货线程,让线程吃包子
                bz.notify();
                System.out.println("包子铺已经生产好了!吃货可以开吃了");


            }
        }
    }
}

包子类

public class Baozi {
    //皮
    String pi;
    //馅
    String xian;

    //包子的状态:有true没有false 设置初始值为false没有包子
    boolean blag =false;

}

吃货类

public class ChiHuo extends Thread {
    private  Baozi bz;

    public  ChiHuo(Baozi bz){
        this.bz=bz;
    }
    @Override
    public void run() {
        while (true){
            synchronized(bz){
                if (bz.blag==false){
                    try {
                        bz.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                //被唤醒
                System.out.println("吃货正在吃:"+bz.pi+bz.xian+"包子");
                //修改包子的状态为false
                bz.blag=false;
                //吃货唤醒包子铺线程,生产包子
                bz.notify();
                System.out.println("吃货已经吃完了");
                System.out.println("----------------------");

            }
        }

    }
}

测试类

 public class DemoTest {
    public static void main(String[] args) {
        Baozi bz = new Baozi();
        new baoZiPu(bz).start();
        new ChiHuo(bz).start();
    }
}

posted @ 2021-03-15 17:29  一名初学者  阅读(123)  评论(0)    收藏  举报