其他分享
首页 > 其他分享> > 多线程-等待唤醒-包子案例演示

多线程-等待唤醒-包子案例演示

作者:互联网

等待唤醒案例

消费者和生产者

需求

包子铺线程生产包子 吃货线程消费包子 当包子没有时 吃货线程等待 包子铺线程生产包子 并通知吃货线程 因为已经由包子了 那么包子铺进入等待状态

接下来 吃货线程能否进一步执行则取决于锁的获取情况 如果吃货获取到锁 那么就执行吃包子动作 包子吃完 并通知包子铺 吃货线程进入等待 包子铺线程能否进一步执行则取决于锁的获取情况

 

 

 案例代码:

 包子类:

public class BaoZi {
    //包子皮
    String pi;
    //包子陷
    String xian;
    //包子的状态:有true 没有false 设置初始值为false没有包子
    boolean flag=false;
}

包子铺:

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==true){
                    //包子铺调用wait方法进入等待状态
                    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+"包子");
                //生产包子需要3秒
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //包子铺生产好了包
                bz.flag=true;
                bz.notify();
                System.out.println("包子铺已经生产好了:"+bz.pi+bz.xian+"包子,吃货可以开始吃了");
            }
        }
    }
}

吃货类:

public class ChiHou extends Thread {
    private BaoZi bz;

    public ChiHou(BaoZi bz) {
        this.bz = bz;
    }
    //设置线程任务

    @Override
    public void run() {
        //使用死循环 让吃货一直吃包子
        while (true) {
            //设置同步锁
            synchronized (bz) {
                //对包子的状态进行判断
                if (bz.flag == false) {
                    //吃货调用wait方法进入等待状态
                    try {
                        bz.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                    //被唤醒之后执行的代码 吃包子
                    System.out.println("吃货正在吃" + bz.pi + bz.xian + "的包子");
                    //修改包子的状态
                    bz.flag = false;
                    //通知生产包子
                    bz.notify();
                    System.out.println("吃货已经吃" + bz.pi + bz.xian + "的包子,厂家正在生产");
                    System.out.println("------------------------------");


            }
        }
    }
}

测试类:

public class test {
    public static void main(String[] args) {
        BaoZi baoZi = new BaoZi();
        new BaoZiPu(baoZi).start();
        new ChiHou(baoZi).start();
    }
}

标签:包子铺,吃货,public,线程,演示,多线程,包子,bz
来源: https://www.cnblogs.com/aimz01/p/16469956.html