使用C#的泛型队列Queue实现生产消费模式
2019独角兽企业重金招聘Python工程师标准>>>
本篇体验使用C#的泛型队列Queue<T>实现生产消费模式。
如果把生产消费想像成自动流水生产线的话,生产就是流水线的物料,消费就是某种设备对物料进行加工的行为,流水线就是队列。
现在,要写一个体现生产消费模式的泛型帮助类,比如叫ProducerConsumer<T>。
该类肯定会维护一个有关生产、物料的Queue<T>类型的字段,还存在一个有关消费、Action<T>类型的字段。
在ProducerConsumer类的构造函数中,为Action<T>类型的字段赋值,并开启后台有关消费的线程。
ProducerConsumer类肯定存在一个进队列的方法,并且要保证在多线程情况下,同一时间只有一个生产或物料进入队列。
ProducerConsumer类还存在一个有关消费的方法,并且保证在多线程情况下,同一时间只有一个生产或物料出列,并消费它。
另外,在生产或物料在出队列的时候,可能会出现队列中暂时没有生产或物料的情况,这时候我们希望线程阻塞一下,这需要通过AutoResetEvent实现。AutoResetEvent的大致原理是:当生产或物料进入队列的时候需要告诉AutoResetEvent一下,当队列中暂时没有生产或物料的时候,也需要告诉AutoResetEvent,让它来阻塞线程。
//有关生产消费的泛型类public class ProducerConsumer<T>{//用来存储生产者的队列private readonly Queue<T> queue = new Queue<T>();//锁private readonly object queueLocker = new object();//消费行为private readonly Action<T> consumerAction;//出列的时候需要检查队列中是否有元素,如果没有,需要阻塞private readonly AutoResetEvent queueWaitHandle = new AutoResetEvent(false);public ProducerConsumer(Action<T> consumerAction){if (consumerAction == null){throw new ArgumentNullException("consumerAction");}this.consumerAction = consumerAction;//后台开启一个线程开始消费生产者new Thread(this.ConsumeItems){IsBackground = true}.Start();}//进列public void Enqueue(T item){//确保同一时间只有一个生产者进列lock (queueLocker){queue.Enqueue(item);//每次进列都要设置AutoResetEvent事件this.queueWaitHandle.Set();}}//消费动作private void ConsumeItems(){while (true){T nextItem = default(T);//标志,确认队列中的生产者是否存在bool doesItemExist;//确保同一时间只有一个生产者出列lock (this.queueLocker){//先确认队列中的生产者是否存在doesItemExist = this.queue.Count > 0;if (doesItemExist){nextItem = this.queue.Dequeue();}}//如果生产者存在,才消费生产者if (doesItemExist){this.consumerAction(nextItem);}else//否则的话,再等等下一个队列中的生产者{this.queueWaitHandle.WaitOne();}}}}
客户端,针对多线程情形:
class Program{static void Main(string[] args){//实例化一个int类型的生产消费实例var producerConsumer = new ProducerConsumer<int>(i => Console.WriteLine("正在消费" + i));Random random = new Random();//开启进队列线程var t1 = new Thread(() =>{for (int i = 0; i < 100; i++){producerConsumer.Enqueue(i);Thread.Sleep(random.Next(0,5));}});var t2 = new Thread(() =>{for (int i = 0; i > -100; i--){producerConsumer.Enqueue(i);Thread.Sleep(random.Next(0, 5));}});t1.Start();t2.Start();t1.Join();t2.Join();Thread.Sleep(50);Console.ReadKey();}}
转载于:https://my.oschina.net/u/200350/blog/886738
使用C#的泛型队列Queue实现生产消费模式相关推荐
- 递归泛型二叉树、List、Set、Map、队列Queue
一. 二叉树递归泛型版 泛型比较大小转成Comparable调用compareTo 将泛型值t强转Comparabl,调用compareTo用来比较public class Treetwo2<T ...
- PYTHON——多线程:队列Queue数据结构
1.队列模块简介 队列是一种数据结构,用于存放数据,类似列表.它是先进先出模式(FIFO模式),类似管道一般: 单线程不需要用到队列Queue,它主要用在多线程之间的,Queue称为多线程利器. 列表 ...
- 35 线程优先级队列(queue)
Python的queue模块中提供了同步的.线程安全的队列类,包括先进先出队列Queue.后进先出队列LifoQueue和优先级队列PriorityQueue.这些队列都是先了锁原语,可以直接使用来实 ...
- python判断队列是否为空_[python模块]队列queue
一.队列queue 队列queue 多应用在多线程场景,多线程访问共享变量. 对于多线程而言,访问共享变量时,队列queue的线程安全的. 因为queue使用了一个线程锁(pthread.Lock() ...
- python队列长度_[python模块]队列queue
一.队列queue 队列queue 多应用在多线程场景,多线程访问共享变量. 对于多线程而言,访问共享变量时,队列queue的线程安全的. 因为queue使用了一个线程锁(pthread.Lock() ...
- Java队列Queue
队列Queue是一个先进先出的数据结构:与list.set同一级别,继承了collection接口. Queue的实现 阻塞队列(BolckingQueue) 非阻塞队列 阻塞队列(BolckingQ ...
- java多线程12:阻塞队列Queue
本篇主要内容如下: 本篇主要内容 帮你总结好的阻塞队列: 18种Queue总结 一.Queue自我介绍 队列原理图 1.1 Queue自我介绍 hi,大家好,我的英文名叫Queue,中文名叫队列,无论 ...
- 消息队列Queue大全
消息队列Queue大全 (http://queues.io/) 作业队列,消息队列和其他队列.几乎所有你能想到的都在这. 关于 那里有很多排队系统.他们每个人都不同,是为解决某些问题而创建的.这个页面 ...
- python队列效率_Python之队列Queue
今天我们来了解一下python的队列(Queue) queue is especiall useful in threaded programming when information must be ...
- python队列线程池_实例详解:python高级编程之消息队列(Queue)与进程池(Pool)
今天为大家带来的内容是:python高级编程之消息队列(Queue)与进程池(Pool),结合了实例的形式详细分析了Python消息队列与进程池的相关原理.使用技巧与操作注意事项!!! Queue消息 ...
最新文章
- 分类讨论 ---- 2020 icpc 上海 Walker (二分 or 思维分类讨论)
- Excel技巧之——英文大小写转换(转)
- Django 无法加载静态文件(js,css,image)解决办法
- 日志处理--高效Linux命令整理
- 百度世界-“框天地”
- JAVA程序设计----java面向对象基础(下)
- 香草 jboss 工具_如何为JBoss Developer Studio 8设置BPM和规则工具
- linux捕捉信号sigint失败,为shell布置陷阱:trap捕捉信号方法论
- 成本管控难题怎么破?BI大神带你一步步拆解分析,节省成本390万
- 新人入职,上午写了一段代码,下午就被开除了
- 今日头条电脑版官方版_雷霆拯救电脑版-雷霆拯救pc版下载v4.0.9 官方版
- Druid的Segment Balance及其代价计算函数分析
- 低代码,是否能“取代”开发者?
- 为了自动驾驶,Uber每月烧钱1.3亿
- qt通过http连接mysql_Azure Database for MySQL 连接安全-(3) Private Endpoint
- keil中 code、data、idata的区别
- 基于互信息的特征选择算法MATLAB实现
- yii2设置session时间_YII2 设置session过期时间
- oracle---SQLPlus命令操作用法详解
- javaweb 温习