Java实现生产者消费者案例

2023-05-16

目录

一、生产者消费者模式概述

二、生产者消费者案例

三、代码

奶箱类(Box):

生产者类(Producer):

消费者类(Customer):

测试类(BoxDemo):

四、运行结果


一、生产者消费者模式概述

生产者消费者是一个十分经典的多线程协作的模式,弄懂生产者消费者问题能够让我们对多线程编程的理解更加深刻,所谓生产者消费问题,实际上主要是包含了两类线程:

1、一类是生产者线程用于生产数据

2、一类是消费者线程用于消费数据

为了解生产者和消费者的关系,通常会采用共享的数据区域,就像是一个仓库

1、生产者生产数据之后直接放置在共享区中,并不需要关心消费者的行为

2、消费者只需要从共享数据区中去获取数据,并不需要关心生产者的行为

二、生产者消费者案例

生产者和消费者案例中包含的类:

        1、奶箱类(Box):定义一个成员变量,表示第x奶,提供存储牛奶的和获取牛奶的操作

        2、生产者类(Producer):实现Runnable接口,重写run()方法,调用存储牛奶的操作

        3、消费者类(Customer):实现Runnable接口,重写run()方法,调用获取牛奶的操作

        4、测试类(BoxDemo):里面有main方法,main方法中的代码步骤如下

            A:创建奶箱对象,这是共享数据区域

            B:创建生产者对象,把奶箱对象作为构造方法参数传递,因为在这个类中要调用存储牛奶的操作

            C:创建消费者对象,把奶箱对象作为构造方法参数传递,因为在这个类中要调用获取牛奶的操作

            D:创建2个线程对象,分别把生产者对象和消费者对象作为构造方法参数传递

            E:启动线程

三、代码

奶箱类(Box):

public class Box {
    //定义一个成员变量,表示第x瓶奶
    private int milk;
    //定义一个成员变量,表示奶箱的状态
    private boolean state = false;

    //提供存储牛奶的和获取牛奶的操作
    public synchronized void put(int milk) {
        //如果有牛奶,等待消费
        if (state) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        //如果没哟牛奶,就生产牛奶
        this.milk = milk;
        System.out.println("送奶工将第" + this.milk + "瓶奶放入奶箱");

        //生产完毕之后,修改奶箱状态
        state = true;

        //唤醒其他等待的想线程
        notifyAll();
    }

    public synchronized void get() {
        //如果没有牛奶等待生产
        if (!state) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        //如果有牛奶,就消费牛奶
        System.out.println("用户拿到第" + this.milk + "瓶奶");

        //生产完毕之后,修改奶箱状态
        state = false;

        //唤醒其他等待的想线程
        notifyAll();
    }

}

生产者类(Producer):

public class Producer implements Runnable {
    private Box b;
    
    public Producer(Box b) {
        this.b = b;
    }

    @Override
    public void run() {
        for (int i = 1; i <= 5; i++) {
            b.put(i);
        }
    }
}

消费者类(Customer):

public class Customer implements Runnable {
    private Box b;

    public Customer(Box b) {
        this.b = b;
    }

    @Override
    public void run() {
        while (true) {
            b.get();
        }
    }
}

测试类(BoxDemo):

public class BoxDemo {
    public static void main(String[] args) {
        //创建奶箱对象,这是共享数据区域
        Box b = new Box();

        //创建生产者对象,把奶箱对象作为构造方法参数传递,因为在这个类中要调用存储牛奶的操作
        Producer p = new Producer(b);

        //创建消费者对象,把奶箱对象作为构造方法参数传递,因为在这个类中要调用获取牛奶的操作
        Customer c = new Customer(b);

        //创建2个线程对象,分别把生产者对象和消费者对象作为构造方法参数传递
        Thread t1 = new Thread(p);
        Thread t2 = new Thread(c);

        //启动线程
        t1.start();
        t2.start();
    }
}

四、运行结果

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java实现生产者消费者案例 的相关文章

随机推荐

  • springboot项目启动报错:找不到或无法加载主类【已解决】

    在配 置完一个完整的springboot项目后 xff0c 需要测试是否正确配置 xff0c 出现未加载或未找到加载类的情况 xff0c 可能有以下原因 xff1a 首先需要观察启动类在项目中的位置 xff0c 确保启动类与其他层的包在同一
  • 对于 nested exception is java.net.ConnectException问题【已解决】

    当在springcloud遇到这类问题时 xff0c 需要排查控制器中的路径是否写对 xff0c 由于我报错的项目是一个模拟客户端访问查询业务功能 xff0c 下面是我的源代码 xff08 报错 xff09 xff1a public sta
  • 如何搭建一个基本的Spring项目【Maven】

    相信很多朋友在刚学习Spring时 xff0c 都会存在这个疑问 xff0c 如何正确搭建一个Spring项目 xff0c 以及中间的许多报错无法解决 xff0c 大家可以跟着我一起试一下 xff0c 有问题的朋友评论区见 1 Spring
  • 使用注解开发时需要添加包扫描器【出现问题的可以点进来看看】

    很多第一次接触Spring注解开发的同学 xff0c 在使用注解后容易报错 xff0c 那就很可能是没有在配置文件中加入包扫描器 那么可以往下看 xff0c 以下面这个简单的例子来学习 下面是一个简单的实体类 xff0c 通过Compone
  • 如何使用Autowried,以及与Resource的区别

    在使用注解开发的过程中 xff0c 有个经常会见面的朋友 Autowried xff08 自动装配 xff09 xff0c 刚接触的朋友肯定不能理解自动装配这个词的含义 简单解释一下 xff0c 自动装配将通过已知的类型自动分配对象 xff
  • SpringMVC遇到的有关实体类的报错

    今天在复习SpringMVC数据传参的时候 xff0c 出现了一个非常小的问题 xff0c 主要是为了实验如何将一个对象作为参数传递 xff0c 我创建了两个类 xff0c 但是由于被传递的对象的那个类没有用public 修饰 xff0c
  • app:checkDebugDuplicateClasses错误

    此异常完整表述为 org gradle api tasks TaskExecutionException Execution failed for task 39 app checkDebugDuplicateClasses 39 这类问题
  • LAMP网站架构

    一 LAMP网站架构 1 1 基本定义 LAMP是指一组通常一起使用来运行动态网站或者服务器的自由软件名称首字母缩写 Linux xff0c 操作系统Apache xff0c 网页服务器 MariaDB或MySQL xff0c 数据库管理系
  • pancakeswap薄饼添加流动性后实现永久锁仓

    添加完流动性后 xff0c 永久锁仓就是放弃对资金池的控制 xff0c 就是放弃了对流动性的所有权 xff0c 没有办法撤池子了 现在锁仓分为2种 xff0c 一个是丢黑洞永久锁仓 xff0c 另外一种是短期锁仓 xff0c 锁在智能合约中
  • ubuntu14.04 root用户登录方法

    如果你是刚刚装完ubuntu14 04系统 xff0c 你进去后是以普通用户登录的 xff0c 很多操作并没有权限 xff0c 要想获得全部权限可以以root用户登录 1 先解除root锁定 xff0c 为root用户设置密码 打开终端输入
  • pycharm终端常用指令

    在调试ppddle的时候下载的coco数据集过大 xff0c 一时没有注意不急的如何终止 xff0c 所以转载一个记一下 Terminal快捷键 功能 Tab 自动补全 Ctrl 43 a 光标移动到开始位置 Ctrl 43 e 光标移动到
  • 解决Mac电脑因kotlin插件禁用导致的Android Studio无法打开问题

    解决这个办法需要将Android Studio目录下的disabled plugins txt文档中的org jetbrains kotlin删除即可 文件位置 Users mac Library Application Support G
  • 实现生产者消费者进程(Java)

    目录 前言 一 实验要求 二 步骤 1 主类 2 消费者 3 生产者 4 超市 前言 消费者问题是操作系统中典型的进程同步互斥问题 xff0c xff08 英语 xff1a Producer Consumer problem xff09 x
  • python | Pandas库数据预处理-缺失值篇:info()、isnull()、dropna()、fillna()函数

    相关文章 python Pandas库导入Excel数据 xff08 xlsx格式文件 xff09 函数 xff1a read excel python Pandas库导入csv格式文件函数 xff1a read excel 目录 数据源
  • vue3学习笔记 2023

    vue文件 34 组件 34 是一种封装的思想 把相关业务逻辑的 34 js css html 34 都封装到一起 当需要调用 34 组件 34 的时候 只需要在html中期望的位置插入对应的 34 标签 34 即可 比如封装了一个 34
  • STP详解

    STP STP全称为 生成树协议 xff08 Spanning Tree Protocol xff09 xff0c 是一种网络协议 xff0c 用于在交换机网络中防止网络回路产生 xff0c 保证网络的稳定和可靠性 它通过在网络中选择一条主
  • 【Linux】线程篇---线程安全&&生产者消费者模型

    目录 1 线程安全概念 2 互斥的实现 2 1互斥锁 2 2互斥锁原子性的保证 2 3互斥锁接口 2 3 1初始化互斥锁 2 3 2互斥锁加锁接口 2 3 3解锁接口 2 3 4 销毁互斥锁接口 2 4代码验证锁的接口 3 同步的实现 3
  • 收藏版|史上最全机器学习优化器Optimizer汇总

    转载于收藏版 xff5c 史上最全机器学习优化器Optimizer汇总 掘金 juejin cn 作者 xff1a 苏学算法 链接 xff1a https juejin cn post 7084409806492008456 来源 xff1
  • 三种图像内插法(最近邻内插法、双线性内插法、双三次内插法)的做法 & 代码实现

    参考博客 数字图像处理学习笔记 xff08 四 xff09 数字图像的内插 度量 表示与质量 闭关修炼 暂退的博客 CSDN博客 数字图像处理学习笔记 xff08 七 xff09 用Pycharm及MATLAB实现三种图像内插法 xff08
  • Java实现生产者消费者案例

    目录 一 生产者消费者模式概述 二 生产者消费者案例 三 代码 奶箱类 xff08 Box xff09 生产者类 xff08 Producer xff09 xff1a 消费者类 xff08 Customer xff09 xff1a 测试类