原作者:老铁123   
出处:https://blog.csdn.net/qewgd/article/details/85926275   
本文归作者【老铁123】和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

生产者消费者模式
1、生产者只在仓库未满时进行生产,仓库满时生产者进程被阻塞;
2、消费者只在仓库非空时进行消费,仓库为空时消费者进程被阻塞;

一、synchronized方式实现
代码如下

**ProduceAndConsumeBySynchronized.java**
public class ProduceAndConsumeBySynchronized{// TODO多线程调用
}class StoreWN {public int capacity = 10;public int index = 0;public synchronized void produce() {while (index >= capacity) {try {wait();} catch (InterruptedException e) {e.printStackTrace();}}index++;notifyAll();}public synchronized void consume() {while (index <= 0) {try {wait();} catch (InterruptedException e) {e.printStackTrace();}}index--;notifyAll();}
}class Producer implements Runnable {StoreWN swn = null;public Producer(StoreWN swn) {this.swn = swn;}public void run() {swn.produce();}
}class Consumer implements Runnable {StoreWN swn = null;public Consumer(StoreWN swn) {this.swn = swn;}public void run() {swn.consume();}
}

二、Lock API方式实现
代码如下

**ProduceAndConsumeByLockApi.java**import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;public class ProduceAndConsumeByLockApi {// TODO多线程调用
}class StoreAS {public int capacity = 10;public int index = 0;Lock lock = new ReentrantLock();Condition full = lock.newCondition();Condition empty = lock.newCondition();public void produce() {lock.lock();try {while (index >= capacity) {try {full.await();} catch (InterruptedException e) {e.printStackTrace();}}index++;empty.signalAll();} finally {lock.unlock();}}public void consume() {lock.lock();try {while (index <= capacity) {try {empty.await();} catch (InterruptedException e) {e.printStackTrace();}}index--;full.signalAll();} finally {lock.unlock();}}
}class ProducerAS implements Runnable {StoreAS swn = null;public ProducerAS(StoreAS swn) {this.swn = swn;}public void run() {swn.produce();}
}class ConsumerAS implements Runnable {StoreAS swn = null;public ConsumerAS(StoreAS swn) {this.swn = swn;}public void run() {swn.consume();}
}

三、阻塞队列方式实现(底层就是实现方式二)
代码如下

**ProduceAndConsumeByBlockingQueue.java**import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;public class ProduceAndConsumeByBlockingQueue {// TODO多线程调用
}class StoreBQ {BlockingQueue<Integer> bq = new ArrayBlockingQueue<Integer>(10);public void produce(){try {bq.put(1);} catch (InterruptedException e) {}}public void consume(){try {bq.take();} catch (InterruptedException e) {}}
}class ProducerBQ implements Runnable {StoreBQ swn = null;public ProducerBQ(StoreBQ swn) {this.swn = swn;}public void run() {swn.produce();}
}class ConsumerBQ implements Runnable {StoreBQ swn = null;public ConsumerBQ(StoreBQ swn) {this.swn = swn;}public void run() {swn.consume();}
}

生产者消费者模式的三种实现方式相关推荐

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

    2.生产者-消费者模式的三种实现方式 1.背景                                                                    生产者生产数据到缓 ...

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

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

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

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

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

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

  5. 实现生产者-消费者模式的五种方式

    在学习完 RabbitMQ 后,才明白为什么那么喜欢问生产者-消费者问题,因为在很多开发领域都能派上用场. 在 Java基础 以及 操作系统 都有接触,但还是要在这里再总结一下. 文章目录 实现方式 ...

  6. 生产者消费者问题Java三种实现

    生产者-消费者Java实现 2017-07-27 1 概述 生产者消费者问题是多线程的一个经典问题,它描述是有一块缓冲区作为仓库,生产者可以将产品放入仓库,消费者则可以从仓库中取走产品. 解决生产者/ ...

  7. Android中夜间模式的三种实现方式

    参考:https://www.jianshu.com/p/f3aaed57fa15 在本篇文章中给出了三种实现日间/夜间模式切换的方案: 使用 setTheme 的方法让 Activity 重新设置主 ...

  8. 【趣说JAVA】什么是生产者消费者模式?用恶趣味的方式来解释

    故事背景: 从前有一个产奥力给怪物叫扎克,因为自己喜欢产奥力给,所以没人喜欢它,它很自卑,直到有天遇到了一个叫老八的吞翔人,两人惺惺相惜,上演了一出生产者和消费者模式的gay情故事.扎克拉完到厕所,厕 ...

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

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

最新文章

  1. C++11中std::initializer_list的使用
  2. 初识C语言---(3)
  3. Excel取消超级链接
  4. 嵌入式文件系统镜像制作及烧写
  5. c++ class struct同名_C/C++面向对象编程之封装
  6. 【LeetCode笔记】剑指 Offer 58 - I. 翻转单词顺序(Java、栈、双指针)
  7. 性能优化:MySQL 性能提升之降龙十八掌
  8. CDA LEVELⅠ2021最新模拟题一(全网最详细有答案)
  9. python解决八数码问题_A*算法实践——八数码问题
  10. 删除linkinfo.dll
  11. Android存储管理
  12. 微信小程序:升级版手机检测微信工具小程序源码
  13. unity3d+Android:v3签名问题,修改为v2
  14. PXE系列之一:PXE环境搭建
  15. proxychans的使用
  16. 携程连接服务器失败显示0048,携程网回应:携程服务器出故障期间可访问艺龙旅行网...
  17. 重建二叉树(Java)
  18. 图像 - 识别出图片里的数字和字母
  19. linux suse11 sp3安装,redis服务器安装-SuSE Linux Enterprise Server 11 SP3
  20. 程序员的算法趣题Q58: 丢手绢游戏中的总移动距离

热门文章

  1. 苹果库克赢得最佳CEO声誉的10个理由
  2. 数据资产目录构建指南
  3. 基于JAVA网上求职招聘系统计算机毕业设计源码+数据库+lw文档+系统+部署
  4. 通过邮箱监控gpu温度
  5. 全自动指纹门锁方案设计解析
  6. js WebSocket封装
  7. 销售工作第三方销售方法_推销游戏的新方法
  8. 优秀网页翻译:高精度 10MHz GPS 驯服钟 (GPSDO) - Part 2
  9. jQuery制作火柴人游戏源码
  10. 把重要的东西存在手机便签备忘录里安全吗