文档章节

曾今的代码系列——生产者消费者模式

 木宛城主
发布于 2015/03/02 19:41
字数 384
阅读 2
收藏 0

生产者消费者

例如下场景:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类、函数、线程、进程等)。产生数据的模块,就形象地称为生产者;而处理数据的模块,就称为消费者

我们举一个寄信的例子,假设你要寄一封平信,大致过程如下:

  • 你把信写好——相当于生产者制造数据
  • 你把信放入邮筒——相当于生产者把数据放入缓冲区
  • 邮递员把信从邮筒取出——相当于消费者把数据取出缓冲区
  • 邮递员把信拿去邮局做相应的处理——相当于消费者处理数据

生产者消费者模式可以用来处理并发问题的。
从寄信的例子来看。如果没有邮筒,你得拿着信傻站在路口等邮递员过来收(相当于生产者阻塞);又或者邮递员得挨家挨户问,谁要寄信(相当于消费者轮询)。

namespace 生产者消费者
{
    delegate void MyDelegate(string s);
    public partial class Form1 : Form
    {
        
        public Form1()
        {
            InitializeComponent();
            //消费者线程
            System.Threading.Thread thread = new System.Threading.Thread(() =>
            {
                while (true)
                {
                    foreach (string data in listData.ToArray())
                    {
                        MyDelegate doXF = s => txtLog.AppendText(s + "\r\n");
                        //消费
                        txtLog.Invoke(doXF, data);
                        //消费了产品之后就把它移除
                        listData.Remove(data);
                    }
                    //降低CPU压力
                    System.Threading.Thread.Sleep(5000);
                }
            });
            thread.IsBackground = true;
            thread.Start();
        }
        List<string> listData = new List<string>();
        private void btnProduct_Click(object sender, EventArgs e)
        {
            //生产
            listData.Add(txtData.Text);
            txtData.Clear();
            txtData.Focus();
        }

    }
}

 

© 著作权归作者所有

共有 人打赏支持
粉丝 2
博文 222
码字总数 199010
作品 0
黄浦
私信 提问
架构设计:生产者/消费者模式 第1页:“生产者/消费者模式”介绍

★简介 在实际的软件开发过程中,经常会碰到如下场景:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类、函数、线程、进程等)。产生数据的模块,就形...

冰雷卡尔
2014/05/06
112
0
阻塞队列和生产者-消费者模式、DelayQueue

1.ArrayDeque, (数组双端队列) 2.PriorityQueue, (优先级队列) 3.ConcurrentLinkedQueue, (基于链表的并发队列) 4.DelayQueue, (延期阻塞队列)(阻塞队列实现了BlockingQueue接口) ...

天外飞鱼
2014/07/28
0
1
消息中间件系列五、rabbit消息的确认机制

前言:这是中间件一个系列的文章之一,有需要的朋友可以看看这个系列的其他文章: 消息中间件系列一、消息中间件的基本了解 消息中间件系列二、Windows下的activeMQ和rabbitMQ的安装 消息中间...

我巴巴
10/11
0
0
并发编程(五)——生产者消费者模式

在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题。该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度。 为什么要使用生产者和消费者模式 在线程世界里...

whc20011
2016/10/31
34
0
Disruptor 实践:整合到现有的爬虫框架

一. Disruptor Disruptor 是一个高性能的异步处理框架。 Disruptor 是 LMAX 在线交易平台的关键组成部分,LMAX平台使用该框架对订单处理速度能达到600万TPS,除金融领域之外,其他一般的应用...

fengzhizi715
12/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

微信开发-正式号的配置

1、设置相关 业务域名的设置(不设置的话,相关页面会显示防欺诈盗号信息提示) JS接口安全域名设置 网页授权域名设置 注意:以上三个设置中都有下载文件的提示,此文件内容一样,下载一个即可...

Code辉
4分钟前
0
0
微服务之Eureka服务发现

当调用API或者发起网络通信的时候,无论如何我们都要知道被调用方的IP和服务端口,大部分情况是通过域名和服务端口,事实上基于DNS的服务发现,因为DNS缓存、无法自治和其他不利因素的存在,...

架构师springboot
4分钟前
0
0
spring boot2 admin login

版本: admin server 配置 admin client 配置 参考资料

showlike
7分钟前
0
0
NIO、Netty(Netty基础)

一、概述 Netty是一个Java的开源框架。提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。 Netty是一个NIO客户端,服务端框架。允许快...

这很耳东先生
12分钟前
0
0
Spring boot 读文件

每次都忘, 找起来太费事, 因为太乱. 简单说, 就是不打成jar包的时候, 可以返回File, 打成jar包只能返回InputStream. -- 要是把返回File那个方法去掉多好.就不用tmd本地ok, 发布的时候懵逼了....

园领T
13分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部