生产者消费者模型
       具体来讲,就是在一个系统中,存在生产者和消费者两种角色,他们通过内存缓冲区进行通信,生产者生产消费者需要的资料,消费者把资料做成产品。生产消费者模式如下图。(图片来自网络,侵删!)

生产者消费者模型的实现
  生产者是一堆线程,消费者是另一堆线程,内存缓冲区可以使用List数组队列,数据类型只需要定义一个简单的类就好。关键是如何处理多线程之间的协作。这其实也是多线程通信的一个范例。
  在这个模型中,最关键就是内存缓冲区为空的时候消费者必须等待,而内存缓冲区满的时候,生产者必须等待。其他时候可以是个动态平衡。值得注意的是多线程对临界区资源的操作时候必须保证在读写中只能存在一个线程,所以需要设计锁的策略。
       具体实现:

import java.util.LinkedList;public class ProductorConsumerDemo {LinkedList<Integer> lists = new LinkedList<>(); // 定义存放物品的仓库int size = 10; // 定仓库的大小// 生产物品public synchronized void add(Integer i) { // 这里对临界资源的访问贯穿了整个方法,synchronized可以直接加到方法上if (lists.size() == size) { // 首先判断还能不能生产? 也就是容量到了size吗?try {this.wait(); // 不需要的生产 ,就等待} catch (InterruptedException e) {e.printStackTrace();}} else {lists.add(i); // 把生产出来的物品放进仓库this.notifyAll(); // 唤醒消费者线程来消费
        }}// 消费public synchronized int remove() {if (lists.size() == 0) { // 判断有没有物品try {this.wait(); // 如果没有物品就等待, 释放锁} catch (InterruptedException e) {e.printStackTrace();}} else {int i = lists.removeFirst(); // 有物品,就拿走一个if (lists.size() == 0) // 如果拿到了最后一个
            {this.notifyAll(); // 通知生产者生产物品
            }return i;}return -1;}public static void main(String[] args) {ProductorConsumerDemo pcd = new ProductorConsumerDemo();new Thread(new Runnable() {int count = 1;@Overridepublic void run() {while (true) {int i = count++;try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}pcd.add(i);System.out.println(Thread.currentThread().getName() + " 生产了第 " + i + " 个物品,还有" + pcd.lists);}}}, "生产者 ").start();new Thread(new Runnable() {@Overridepublic void run() {while (true) {try {Thread.sleep(110);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + " 消费了第 " + pcd.remove() + "个物品");}}}, "消费者 ").start();}
}

结果:

这种方式很麻烦,在我的下一条博客中将介绍一种简单的实现方法。

转载于:https://www.cnblogs.com/ericz2j/p/10283593.html

Java多线程_生产者消费者模式1相关推荐

  1. 【java并发系列】java多线程实现生产者消费者模式

    大家好,我是walker 一个从文科自学转行的程序员~ 爱好编程,偶尔写写编程文章和生活 欢迎关注公众号[I am Walker],回复"电子书",就可以获得200多本编程相关电子 ...

  2. Java线程实现生产者—消费者模式

    在这里插入代码片# Java 线程实现生产者-消费者模式 ##思路:实现类似消费者生产者线程之间通讯的功能,每创建一个工人,就让这个工人干活,干一段时间,工人自动消失,然后又去创建一个工人干活: 代码 ...

  3. java consumed_Java设计模式—生产者消费者模式(阻塞队列实现)

    生产者消费者模式是并发.多线程编程中经典的 真实世界中的生产者消费者模式 生产者和消费者模式在生活当中随处可见,它描述的是协调与协作的关系.比如一个人正在准备食物(生产者),而另一个人正在吃(消费者) ...

  4. Java多线程:生产者消费者模型

    文章目录 1.生产者消费者 1.1 生产者和消费者模式概述 1.2 经典案例:生产者和消费者 1.2.1 Object类的等待和唤醒方法 1.2.2 代码实现 1.3 生产者和消费者案例优化 1.3. ...

  5. 【多线程】--生产者消费者模式--synchronized版本

    在实现生产者消费者模式之前,我们先了解一下线程的5种状态:被创建.运行.冻结.消亡.阻塞,如下图: 在Jdk1.5发布之前,我们实现生产者消费者模式一般使用synchronized + while循环 ...

  6. Python多线程实现生产者消费者模式

    什么是生产者消费者模式 在软件开发的过程中,经常碰到这样的场景: 某些模块负责生产数据,这些数据由其他模块来负责处理(此处的模块可能是:函数.线程.进程等).产生数据的模块称为生产者,而处理数据的模块 ...

  7. Java线程实现生产者消费者模式

    1 什么是生产者消费者模式 想一个现实生活中的例子,啤酒商---超市---消费者也就是我们,啤酒商生产了啤酒,然后将啤酒销售给了超市,我们消费之又会到超市将啤酒买回来自己喝,那么啤酒商和消费者之间是什 ...

  8. Java 并发(生产者/消费者 模式)

    >生产者/消费者 模式角色:生产者,消费者都是线程,两者中间是容器,容器内部是产品. 要求: 容器 里面要定义容量 容器 往里面添加(满时等待) 或者 从里面删除(空时等待) ,都要是阻塞的(等 ...

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

    一.问题介绍 生产者消费者问题是一个经典的多线程同步问题.该问题描述了两个进程--即所谓的"生产者"和"消费者"--在实际运行时会发生的问题.生产者的主要作用是 ...

  10. C++多线程实现生产者消费者模式

    这里记录C++多线程实现生成者消费者模式. 代码执行环境:wins Visual Studio 2017 执行逻辑:生产者和消费者公用一个队列作为临界资源,当队列满时生产者暂停生成:当队列为空时,消费 ...

最新文章

  1. Yii2 使用 Joins 查询
  2. list、tuple、set、dict 四大数据结构
  3. Tensorflow中placeholder传入值与feed_dict喂食器的联系与用法
  4. C语言再学习 -- Xargs用法详解
  5. mysql怎么新增_mysql怎么新增用户
  6. SpringBoot中使用Shiro和JWT做认证和鉴权
  7. matlab读取图片亮度,Matlab中使用imagesc函数显示的亮度图像怎么和原图像的大小不一样?...
  8. 开始学习openlayer
  9. GPU 编程 CPU 异同点_专业软件与CPU的性能相关性详细对比
  10. SQL正则表达式的妙用
  11. vscode 开发maven项目(springboot项目)
  12. 大数据资料全解析(352个案例+大数据交易白皮书+国内外政策汇篇)
  13. access 链接mysql数据库教程_ACCESS实例教程(数据库的编程)
  14. python里apply用法_python中apply函数是什么?
  15. 用计算机怎么弹两只老虎,七键两只老虎曲谱_64键的电子琴怎么弹两只老虎1234567按哪个键...
  16. 【Hive】Establishing SSL connection without server‘s identity verification is not recommended. Accord
  17. Mac运行Win 10画面出问题?教你如何修复这个问题
  18. 辽宁省朝阳市高考成绩查询2021,2021年朝阳高考状元多少分是谁,朝阳高考状元名单资料...
  19. win10中conda activate激活环境出错的解决办法
  20. [置顶]封闭环境下的人性博弈——长文纪念诺兰的蝙蝠侠三部曲

热门文章

  1. 分享一个非常不错的SSH工具
  2. Nginx基本配置备忘
  3. 1算法:控制字幕左右移动
  4. leetcode------Binary Tree Level Order Traversal II
  5. 使Iframe的宽高自适应,并且兼容IE 和NC浏览器- -
  6. Rational相关工具介绍
  7. Linux系统编程 -- IO缓冲区
  8. linux设备驱动程序注册过程详解
  9. Dubbo不向zookeeper/nacos注册
  10. server使用abp中调用存储过程 sql_ABP中连接已有数据库执行Sql或存储过程