线程练习题生产者与消费者

本文深入探讨Java中的经典多线程问题——生产者与消费者模型,通过实例分析如何使用线程同步机制实现高效的数据共享。我们将讲解如何利用wait(), notify()和notifyAll()方法协调生产者线程与消费者线程之间的交互,确保数据的一致性和避免死锁现象。" 100551517,8673400,ROS(Kinetic和Melodic)中cartographer建图问题与解决方案,"['ROS', 'cartographer', 'slam', '机器人导航', '配置问题']
摘要由CSDN通过智能技术生成

//测试类
public class Test {
    public static void main(String[] args) {
        //创建包子对象
        Baozi baozi = new Baozi();
        //创建包子铺线程对象
        new Cost(baozi).start();
        //创建吃货线程对象
        new Foodie(baozi).start();
    }
}






/*
资源类:包子类
设置包子的属性
皮
陷
包子状态  有true  没有false
 */
class Baozi {
    //皮
    String pi;
    //馅
    String xian;
    //包子的状态  有true  没有 false,设置初始值为false,没有包子
    boolean flag = false;
}










//包子铺
/*
  生产者(包子铺):是一个线程类,继承Thread类
      设置线程的任务:生产包子
  true:有包子
     包子调用wait方法进入等待状态
  false:没有包子
    包子铺生产包子
    修改包子的状态为true
    唤醒吃货线程,让吃货去吃包子
  注意:
     包子铺线程和吃货线程关系---》通信(互斥)
     必须使用同步技术保证两个线程只能有一个线程在执行
     锁对象必须保证唯一,可以使用包子对象作为锁对象
     包子铺线程和吃货线程的类需要把包子对象作为参数传递进来
       1.需要在成员的位置上创建一个包子变量
       2.使用带参构造,为这个包子变量赋值
 */
class Cost extends Thread {
    //1.需要在成员的位置上创建一个包子变量
    private Baozi baozi;

    //使用带参构造,为这个包子变量赋值
    public Cost(Baozi baozi) {
        this.baozi = baozi;
    }

    //重写run方法

    @Override
    public void run() {
        //设置线程任务:生产包子
        //定义一个变量
        int count = 0;
        //让包子铺一直生产包子
        while (true) {
            //必须保证两个线程只能有一个线程在执行
            synchronized (baozi) {
                //进行包子的状态判断
                if (baozi.flag) {
                    //包子铺有包子,包子铺需要调用wait方法进入等待状态
                    try {
                        baozi.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                //包子铺没有包子,被唤醒之后,包子铺生产包子
                //增加一些难度;交替生产两种类型的包子
                if (count % 2 == 0) {
                    //生产 肉馅的包子,皮是薄皮
                    baozi.pi = "薄皮";
                    baozi.xian = "肉馅";
                } else {
                    //生产  蔬菜馅的包子,皮是厚皮
                    baozi.pi = "厚皮";
                    baozi.xian = "蔬菜馅";
                }
                count++;
                System.out.println("包子铺正在生产:" + baozi.xian +
                        baozi.pi + "包子");
                //生产包子需要有一个过程;等待1秒钟
                try {
                    Thread.sleep(1000);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                //包子铺生产好了包子
                //修改包子的状态为true 有
                baozi.flag = true;
                //唤醒吃货线程,让吃货线程去吃包子

                baozi.notify();
                System.out.println("包子铺已经生产好了:" + baozi.pi
                        + baozi.xian + "包子,吃货可以去吃了。。。。");

            }

        }
    }
}







/*
 消费者(吃货类):是一个线程类
 设置线程的任务:吃包子
  对包子的状态进行判断
  true :有包子
    吃货吃包子
    吃货吃完包子
    修改包子的状态为false:没有包子
    吃货唤醒包子铺线程,生产包子
  false:没有包子
    吃货调用wait方法,进入到等待状态
 */
class Foodie extends Thread {
    //1.需要在成员的位置上定义一个包子变量
    private Baozi baozi;

    //2.使用带参构造,为这个包子变量赋值
    public Foodie(Baozi baozi) {
        this.baozi = baozi;

    }

    //3.重写run方法


    @Override
    public void run() {
        //设置线程任务:吃包子
        //使用死循环,让吃货一直吃包子
        while (true) {
            //使用同步技术保证两个线程只有一个线程在执行
            synchronized (baozi) {
                //对包子状态进行判断
                if (baozi.flag==false) {
                    //让吃货线程进入到等待状态
                    try {
                        baozi.wait();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                //被唤醒后执行吃包子
                System.out.println("吃货正在吃:" + baozi.pi + baozi.xian
                        + "包子");
                //吃货吃完包子
                //修改包子的状态为false没有
                baozi.flag = false;
                //吃货线程唤醒包子铺线程---》生产包子
                baozi.notify();
                System.out.println("吃货已经把" + baozi.pi + baozi.xian + "的包子吃完了");
                System.out.println("----------------------------------");
            }
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值