目录

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

二、生产者消费者案例

三、代码

奶箱类(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;}@Overridepublic 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;}@Overridepublic 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();}
}

四、运行结果

Java实现生产者消费者案例相关推荐

  1. 7.生产者消费者 案例 (使用Lock 同步锁 方式,使用Condition完成线程之间的通信)...

    1 /* 2 * 生产者消费者 案例 (使用Lock 同步锁 方式,使用Condition完成线程之间的通信) 3 * */ 4 public class TestProductorAndConsum ...

  2. Java多线程-生产者消费者问题(多个消费者多个生产者)

    Java多线程-生产者消费者问题(多个消费者多个生产者) public class ConsumerProcuderDemo {public static void main(String[] arg ...

  3. 【Java】生产者消费者模型

    [Java]生产者消费者模型 0x1 前言 生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,生产者往存储空间中添加产品,消费者从存储空间中取走产品,当存储空间 ...

  4. java实现生产者消费者模式

    一: 什么是生产者消费者模型 生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题.生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直 ...

  5. 【Java】生产者消费者模式的三种实现

    原文地址:https://blog.csdn.net/u010983881/article/details/78554671 前言 生产者消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内 ...

  6. 【Java】生产者消费者模式的实现

    前言 生产者消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一存储空间,生产者向空间里生产数据,而消费者取走数据. 阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力.这个 ...

  7. 生产者消费者案例java代码

    大纲:java线程知识体系 一.概念 生产者消费者问题也称有限缓冲问题(Bounded-buffer problem),是一个多线程同步问题的经典案例.该问题描述了共享固定大小缓冲区的两个线程--即所 ...

  8. Java多线程——生产者消费者问题

    创建多个线程去执行不同的任务,如果这些任务之间有着某种关系,那么线程之间必须能够通信来协调完成工作. 生产者消费者问题(英语:Producer-consumer problem)就是典型的多线程同步案 ...

  9. 一个简单的生产者消费者案例

    生产者消费者模式 为什么要引入生产者消费者模式 简单来说就是为了解决多线程下程序先后执行问题 遇到的例:实际生产中出现的场景 服务D依赖于服务A.B.C产生的数据,服务D必须等待A.B.C产生结果并持 ...

最新文章

  1. 31行代码AC——PTA 求二叉树的叶子结点个数 (20分)——解题报告
  2. Shell脚本字体颜色
  3. 解决cxgrid主从表数据显示不全的问题
  4. Android基于讯飞语音SDK实现语音识别
  5. SpringBoot +自定义dao框架 自定义注解管理多数据源与事务
  6. WinRunner在项目中的作用
  7. 电商项目中遇到的经典问题
  8. 物联网常用无线模块 接收灵敏度及发射功率简化测量方法
  9. 万人连麦的幕后技术详解
  10. 计算方法(三)平方根法及其改进解线性方程组
  11. Linux 4.15亮点特性
  12. append() 与appendTo 比较
  13. 微软与网景与浏览器之争
  14. Web服务统一身份认证协议设计与实现
  15. 家谱文化研究①:乾隆干预民间修谱有哪些正面影响和负面影响?
  16. 《人民的名义》之陆毅的演技
  17. 应届毕业生注意了,这些典型的学生思维正在阻碍你的职业发展
  18. 车流量统计 matlab,基于视频的车流量统计——matlab代码
  19. 实施一个光明与黑暗的主题,以持久的React
  20. 揭秘 AnolisOS 国密生态,想要看懂这一篇就够了

热门文章

  1. 想发国际期刊,这些工具和技巧你都知道吗?
  2. LeetCode Find Minimum in Rotated Sorted Array
  3. BUCK降压电路空载问题
  4. 2022-2028全球与中国长曲棍球装备市场现状及未来发展趋势
  5. vc驿站视频教程笔记2 ansi 和 unicode
  6. link2SD的原理以及开启方法
  7. Maya动画1:基础知识小球弹跳
  8. Arduino 四针脚声音传感器
  9. 越野赛车问题——线段树分治+并查集
  10. 2022年我在梦想清单里又加了3条