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实现生产消费模式相关推荐

  1. 递归泛型二叉树、List、Set、Map、队列Queue

    一. 二叉树递归泛型版 泛型比较大小转成Comparable调用compareTo 将泛型值t强转Comparabl,调用compareTo用来比较public class Treetwo2<T ...

  2. PYTHON——多线程:队列Queue数据结构

    1.队列模块简介 队列是一种数据结构,用于存放数据,类似列表.它是先进先出模式(FIFO模式),类似管道一般: 单线程不需要用到队列Queue,它主要用在多线程之间的,Queue称为多线程利器. 列表 ...

  3. 35 线程优先级队列(queue)

    Python的queue模块中提供了同步的.线程安全的队列类,包括先进先出队列Queue.后进先出队列LifoQueue和优先级队列PriorityQueue.这些队列都是先了锁原语,可以直接使用来实 ...

  4. python判断队列是否为空_[python模块]队列queue

    一.队列queue 队列queue 多应用在多线程场景,多线程访问共享变量. 对于多线程而言,访问共享变量时,队列queue的线程安全的. 因为queue使用了一个线程锁(pthread.Lock() ...

  5. python队列长度_[python模块]队列queue

    一.队列queue 队列queue 多应用在多线程场景,多线程访问共享变量. 对于多线程而言,访问共享变量时,队列queue的线程安全的. 因为queue使用了一个线程锁(pthread.Lock() ...

  6. Java队列Queue

    队列Queue是一个先进先出的数据结构:与list.set同一级别,继承了collection接口. Queue的实现 阻塞队列(BolckingQueue) 非阻塞队列 阻塞队列(BolckingQ ...

  7. java多线程12:阻塞队列Queue

    本篇主要内容如下: 本篇主要内容 帮你总结好的阻塞队列: 18种Queue总结 一.Queue自我介绍 队列原理图 1.1 Queue自我介绍 hi,大家好,我的英文名叫Queue,中文名叫队列,无论 ...

  8. 消息队列Queue大全

    消息队列Queue大全 (http://queues.io/) 作业队列,消息队列和其他队列.几乎所有你能想到的都在这. 关于 那里有很多排队系统.他们每个人都不同,是为解决某些问题而创建的.这个页面 ...

  9. python队列效率_Python之队列Queue

    今天我们来了解一下python的队列(Queue) queue is especiall useful in threaded programming when information must be ...

  10. python队列线程池_实例详解:python高级编程之消息队列(Queue)与进程池(Pool)

    今天为大家带来的内容是:python高级编程之消息队列(Queue)与进程池(Pool),结合了实例的形式详细分析了Python消息队列与进程池的相关原理.使用技巧与操作注意事项!!! Queue消息 ...

最新文章

  1. 分类讨论 ---- 2020 icpc 上海 Walker (二分 or 思维分类讨论)
  2. Excel技巧之——英文大小写转换(转)
  3. Django 无法加载静态文件(js,css,image)解决办法
  4. 日志处理--高效Linux命令整理
  5. 百度世界-“框天地”
  6. JAVA程序设计----java面向对象基础(下)
  7. 香草 jboss 工具_如何为JBoss Developer Studio 8设置BPM和规则工具
  8. linux捕捉信号sigint失败,为shell布置陷阱:trap捕捉信号方法论
  9. 成本管控难题怎么破?BI大神带你一步步拆解分析,节省成本390万
  10. 新人入职,上午写了一段代码,下午就被开除了
  11. 今日头条电脑版官方版_雷霆拯救电脑版-雷霆拯救pc版下载v4.0.9 官方版
  12. Druid的Segment Balance及其代价计算函数分析
  13. 低代码,是否能“取代”开发者?
  14. 为了自动驾驶,Uber每月烧钱1.3亿
  15. qt通过http连接mysql_Azure Database for MySQL 连接安全-(3) Private Endpoint
  16. keil中 code、data、idata的区别
  17. 基于互信息的特征选择算法MATLAB实现
  18. yii2设置session时间_YII2 设置session过期时间
  19. oracle---SQLPlus命令操作用法详解
  20. javaweb 温习

热门文章

  1. Internet 的50年口述历史七.摩登时代上
  2. Arturia Jup-8 V4 for Mac(旗舰合成器)
  3. HDU5667 - Sequence 矩阵快速幂 + 费马小定理
  4. 【Flutter】Dart的数据类型listMap(数组和字典)
  5. 两个整形变量的值进行交换
  6. Scala笔记2——IDE配置、函数式编程核心概念
  7. android系统文件的权限
  8. 属性,初始化,类别,协议
  9. php生成透明png图像 无锯齿
  10. sed的选项与命令简要