本文主要介绍java中生产者/消费者模式的实现,对java线程锁机制的一次深入理解。

生产者/消费者模型

生产者/消费者模型要保证,同一个资源在同一时间节点下只能被最多一个线程访问,这个在java中用锁就很容易实现。

下面的例子就是模拟多个生产者生产,多个消费者消费的demo

//抽象生产者
public abstract class AbstractProducer implements Runnable {abstract void produce() throws InterruptedException;@Overridepublic void run() {try {while (true) {produce();}} catch (InterruptedException e) {e.printStackTrace();}}
}//抽象消费者
public abstract class AbstractConsumer implements Runnable {abstract void consume() throws InterruptedException;@Overridepublic void run() {try {while (true) {consume();}} catch (InterruptedException e) {e.printStackTrace();}}
}public class ConsumerAndProducerDemo {private static final AtomicInteger ATOMIC_INTEGER = new AtomicInteger();private static final ReentrantLock LOCK = new ReentrantLock();private static final Condition CONDITION = LOCK.newCondition();private static final Queue<Product> PRODUCTS = new LinkedList<>();private static final int SIZE = 4;public static class Product {int id;Product(int id) {this.id = id;}}//实现消费者private static class Consumer extends AbstractConsumer {@Overridevoid consume() throws InterruptedException {try {LOCK.lock();while (PRODUCTS.isEmpty()) {CONDITION.await();}Product product = PRODUCTS.poll();Thread.sleep((long) (500 + Math.random() * 1000));System.out.println(" consume product " + product.id);CONDITION.signalAll();} finally {LOCK.unlock();}}}//实现生产者private static class Producer extends AbstractProducer {@Overridevoid produce() throws InterruptedException {try {LOCK.lock();while (PRODUCTS.size() >= SIZE) {CONDITION.await();}Thread.sleep(1000);Product product = new Product(ATOMIC_INTEGER.incrementAndGet());PRODUCTS.add(product);System.out.println("produce product " + product.id);CONDITION.signalAll();} finally {LOCK.unlock();}}}public static void main(String[] args) {for (int index = 0; index < 2; index++) {new Thread(new Producer()).start();}for (int index = 0; index < 3; index++) {new Thread(new Consumer()).start();}}
}
复制代码

上面的demo这么实现

  1. 启动多个线程模拟多个生产者和多个消费者
  2. 同时使用了queue用来缓存产品
  3. 当缓存区没满时生产者生产
  4. 当缓冲区满时消费者开始消费

线程之间的同步,这里使用了ReentrantLock,ReentrantLock在之前的博客中有介绍过,当然也可以使用Object自带的wait()等方法,实现同步这里就不在修改demo另行实现了。

转载于:https://juejin.im/post/5b948701e51d450e5766c48d

Java生产者 消费者模型的一种实现相关推荐

  1. java生产者消费者流程图_Java 生产者消费者模型的三种实现过程

    生产者一边在生产,消费者一边消耗.当库存满的时候生产者暂停生产,直到有空位:当库存空的时候消费者暂停消费,直到有产品. 关键点: 生产者和消费者都是在不断生产和消费的,是同时并发的,不应该等满了再消费 ...

  2. 【1】生产者-消费者模型的三种实现方式

    (手写生产者消费者模型,写BlockingQueue较简便 ) 1.背景                                                                 ...

  3. 操作系统:生产者消费者模型的两种实现(C++)

    文章目录 生产者消费者模型 什么是生产者消费者模型 生产者消费者模型的321原则 生产者消费者模型的优点 生产者消费者模型的实现方法 基于循环队列,信号量实现 基于阻塞队列,互斥锁.条件变量实现 生产 ...

  4. 生产者-消费者模型的两种实现方式

    https://www.cnblogs.com/caolicangzhu/p/7086176.html 本文主要来总结生产者-消费者模型的代码实现,至于其原理,请大家自行百度. 一.基于链表的生产-消 ...

  5. 生产者消费者模型的三种实现方式

    某个线程或模块的代码负责生产数据(工厂),而生产出来的数据却不得不交给另一模块(消费者)来对其进行处理,在这之间使用了队列.栈等类似超市的东西来存储数据(超市),这就抽象除了我们的生产者/消费者模型. ...

  6. java生产者消费者模型到精通_java生产者消费者模型

    多线程:sleep(),线程处于就绪状态,CPU执行其他线程,该线程的监控状态依然保持着,且不会释放对象锁.notify()线程会放弃对象锁. class Meal { private final i ...

  7. java 生产者消费者_Java多线程:线程间通信—生产者消费者模型

    一.背景 && 定义 多线程环境下,只要有并发问题,就要保证数据的安全性,一般指的是通过 synchronized 来进行同步. 另一个问题是, 多个线程之间如何协作呢 ? 我们看一个 ...

  8. 操作系统 —— 生产者消费者模型

    文章目录 1. 生产者消费者模型的理解 1.1 串行的概念 1.2 并行的概念 1.3 简单总结: 2. 基于阻塞队列(block queue)实现此模型 2.1 阻塞队列的实现 2.2 使用阻塞队列 ...

  9. pattern in java_Java里的生产者-消费者模型(Producer and Consumer Pattern in Java)

    生产者-消费者模型是多线程问题里面的经典问题,也是面试的常见问题.有如下几个常见的实现方法: 1. wait()/notify() 2. lock & condition 3. Blockin ...

最新文章

  1. mfc 开启指定服务器,用MFC实现消息的发送和接收(含服务器)
  2. DNS迭代式和递归式域名查询对比
  3. ajax报403错,django使用ajax post数据出现403错误如何解决
  4. 【2016北京集训测试赛】river
  5. 毕业论文 | 基于脉冲耦合神经网络(PCNN)的图像特征提取:论文及源代码及参考文献
  6. Use tcode ST01 to log authorization check
  7. oracle 11g重新安装配置,Oracle 11g数据库安装和卸载教程
  8. android intent-filter作用,Android中Intent-Filter的匹配规则是什么
  9. centos7优先wifi连接_WIFI明明已连接,但却无法上网,问题究竟出现在哪里?
  10. 如何使用Joyoshare VidiKit Mac版为WMV视频添加字幕?
  11. 【TWVRP】基于matlab遗传算法求解多车场带时间窗的车辆路径规划问题【含Matlab源码 1035期】
  12. python闹钟界面程序_利用QT写一个极简单的图形化Python闹钟程序
  13. 调整数组使奇数全部都位于偶数前面
  14. matlab的小波分析,matlab小波分析步骤是什么
  15. 时间序列分析——自回归移动平均(ARMA)模型
  16. 分享一个很容易实现的某大学的结构光源码【DIY自己的三维扫描仪】
  17. m4a怎么转换成mp4?一个简单好用的操作教程分享
  18. 关机时候计算机更新,电脑关机时提示更新,能否强制关机?
  19. 图像处理之老照片特效
  20. 用 Python 分析各国人口性别比例

热门文章

  1. 语言编程思维陈萌_这本书告诉你,计算机为何能读懂人类语言,编程思维让你更聪明...
  2. 在全员编程时代下,软件测试员又该何去何从?
  3. html画布画带百分比饼状图,echart.js如何画带百分比的饼状图
  4. java程序包r不存在_java - 从命令行使用Gradle构建时,“程序包R不存在”错误 - 堆栈内存溢出...
  5. Python协程原理介绍及基本使用
  6. win7系统下VS2015中CUDA8.0调试程序问题
  7. 下一个十年,什么样的测试会被大厂争抢?
  8. linux目录文件变化,Linux下监测目录或文件的变化---inotify
  9. python编程从入门到实践书中出错的地方_读书笔记「Python编程:从入门到实践」_10.文件和异常...
  10. oppo手机解锁_手机解锁新风尚,OPPO的光域屏幕指纹技术又是哪根儿葱