文档章节

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

 木宛城主
发布于 2015/03/02 19:37
字数 384
阅读 7
收藏 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

没有更多内容

加载失败,请刷新页面

加载更多

js和OC交互

0.html+js 0.1html 代码 <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title> <style> #colordv{ width: 100px;......

walking_yxf
3分钟前
0
0
点播转码相关常见问题及排查方式

概述: 点播转码目前涉及用户上传自动触发转码、通过SubmitTranscodeJobs接口触发转码等方式,会出现用户转码失败的情况,这当中有用户源片的问题、也有用户设置转码参数的原因以及相关资源性...

阿里云官方博客
4分钟前
0
0
工作笔记

Oracle锁表 查找被锁的表 select l.session_id,o.owner,o.object_namefrom v$locked_object l,dba_objects owhere l.object_id=o.object_id; 查找引发锁表的会话 select s.username,s.si......

呼呼南风
7分钟前
0
0
并发工具优于wati、notify(69)

现在几乎没有理由在使用wait 和 notify,使用高级工具代替 java.util.concurrent 包并发工具分三类: Executor 框架 并发集合(concurrent Collection) 同步器(synchronizer) 并发集合 对...

Java搬砖工程师
14分钟前
0
0
AutoCAD_系统变量

https://baike.sogou.com/v53561514.htm?fromTitle=cad%E5%8F%98%E9%87%8F lunits 设置线性单位。1 科学 2 小数 3 工程 4 建筑 5 分数 6 windesk...

一个小妞
21分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部