设计模式-生产者消费者模式 常见场景: 某个模块负责产生数据,这些数据由另一个模块来负责处理。产生数据的模块,就形象地称为生产者;而处理数据的模块,就称为消费者。 该模式还需要有一个缓冲区处于生
来源:互联网 发布:浪拍云的淘宝人生 编辑:程序博客网 时间:2024/06/05 05:29
设计模式-生产者消费者模式
常见场景:
某个模块负责产生数据,这些数据由另一个模块来负责处理。产生数据的模块,就形象地称为生产者;而处理数据的模块,就称为消费者。
该模式还需要有一个缓冲区处于生产者和消费者之间,作为一个中介。生产者把数据放入缓冲区,而消费者从缓冲区取出数据
缓冲区作用
1. 解耦,生产者和消费者只依赖缓冲区,而不互相依赖
2. 支持并发和异步
方式一,同步队列
/** * 生产者、消费者缓冲区 */public class Storage implements IStorage { private final int maxSize = 10; private Queue<Object> queue = new LinkedList<Object>(); @Override public void put(Object obj) { synchronized (queue) { while (queue.size() > maxSize) { System.out.println("缓冲区已满,不能进入"); try { queue.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } queue.add(obj); System.out.println("进入缓冲区"); queue.notifyAll(); } } @Override public Object get() { Object obj = null; synchronized (queue) { while (queue.size() <= 0) { System.out.println("缓冲区为空, 进入等待"); try { queue.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } obj = queue.poll(); System.out.println("离开缓冲区"); queue.notifyAll(); } return obj; }}
方式二,可重入锁
public class Storage implements IStorage { private final int maxSize = 20; private LinkedList<Object> list = new LinkedList<Object>(); private final Lock lock = new ReentrantLock(); // 仓库满的条件变量 private final Condition full = lock.newCondition(); // 仓库空的条件变量 private final Condition empty = lock.newCondition(); @Override public void put(Object obj) { lock.lock(); while (list.size() >= maxSize) { try { System.out.println("缓冲区已满,不能进入"); // 生产阻塞 full.await(); } catch (InterruptedException e) { e.printStackTrace(); } } list.add(obj); System.out.println("进入缓冲区"); empty.signalAll(); lock.unlock(); } @Override public Object get() { lock.lock(); while (list.size() <= 0) { try { System.out.println("缓冲区为空, 进入等待"); // 消费阻塞 empty.await(); } catch (InterruptedException e) { e.printStackTrace(); } } Object obj = list.remove(); System.out.println("离开缓冲区"); full.signalAll(); lock.unlock(); return obj; }}
方式三,阻塞队列
public class Storage implements IStorage { private LinkedBlockingQueue<Object> list = new LinkedBlockingQueue<Object>(10); @Override public void put(Object obj) { try { list.put(obj); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("进入缓冲区"); } @Override public Object get() { Object obj = null; try { obj = list.take(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("离开缓冲区"); return obj; }}
阅读全文
0 0
- 设计模式-生产者消费者模式 常见场景: 某个模块负责产生数据,这些数据由另一个模块来负责处理。产生数据的模块,就形象地称为生产者;而处理数据的模块,就称为消费者。 该模式还需要有一个缓冲区处于生
- 编写一个生产者,消费者多线程程序,一个线程随机产生数据,另一个线程显示所产生的数据.
- 架构设计:生产者/消费者模式[1]:如何确定数据单元?
- 构设计:生产者/消费者模式[1]:如何确定数据单元?
- 架构设计:生产者/消费者模式[1]:如何确定数据单元?
- 生产者/消费者模式2:如何确定数据单元?
- 生产者/消费者模式(二)如何确定数据单元
- 架构设计:生产者/消费者模式:双缓冲区
- 生产者/消费者模式:双缓冲区
- 设计模式-生产者消费者模式
- 设计模式 - 生产者-消费者模式
- 设计模式--生产者消费者模式
- 设计模式-生产者消费者模式
- 线程的生产者消费者模式
- 典型的生产者消费者模式
- 大数据_Kafka_Kafka的控制台 生产者 / 消费者
- 生产者/消费者的示例程序,生产者随机地产生若干个整数,消费者将这些整数输出到屏幕。
- 处理第三方模块的数据
- Hibernate--HQL基础语法
- iOS 用RunTime重写KVO<附Demo>
- Pyspark 如何对变量做累计增量运算
- HDU 1754 I Hate It(线段树-水题,模板题)
- opencv对二值图像进行颜色反色操作
- 设计模式-生产者消费者模式 常见场景: 某个模块负责产生数据,这些数据由另一个模块来负责处理。产生数据的模块,就形象地称为生产者;而处理数据的模块,就称为消费者。 该模式还需要有一个缓冲区处于生
- subliem text 3编译C\C++
- 刷题 集合
- HDU 2795 Billboard(线段树-水题,模板题)
- 法国大革命(1789)
- 软件工程: 从java到放弃
- JSON详解
- 9月7日笔记(mysql数据库命令和JDBC)
- HDU 2838 Cow Sorting(树状数组-水题)