• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > 深入多线程之:深入生产者、消费者队列分析

深入多线程之:深入生产者、消费者队列分析

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c#队列多线程,java队列线程安全,线程队列,多线程队列,线程安全的队列等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

上次我们使用AutoResetEvent实现了一个生产/消费者队列。这一次我们要使用Wait和Pulse方法来实现一个更强大的版本,它允许多个消费者,每一个消费者都在自己的线程中运行。

我们使用数组来跟踪线程。

Thread[] _workers;

通过跟踪线程可以让我们在所有的线程都结束后再结束我们的队列任务。

每一个消费者线程都执行一个叫做Consume的方法,在一个for循环中,我们可以创建和启动线程。例如:

Public delegate void Action();

为了表示一系列的任务,我们使用Queue<T> 集合,例如:

Queue<Action> _itemQ = new Queue<Action>();

在我们调用生产(EnqueueItem)和消费(Consume)方法前,还是完整的看一看代码吧:

        public void Shutdown(bool waitForWorkers)
        {
           //为每一个线程插入一个null item,可以是每一个worker 退出
            foreach (Thread worker in _workers)
                EnqueueItem(null);

           //等待所有的线程退出。
            if (waitForWorkers)
                foreach (Thread worker in _workers)
                    worker.Join();
        }

        public void EnqueueItem(Action item)
        {
            lock (_locker)
            {
                _itemQ.Enqueue(item);
                Monitor.Pulse(_locker); //通知等待队列中的线程
            }
        }

        void Consume()
        {
            while (true)
            {
                Action item;
                lock (_locker)
                {
                    while (_itemQ.Count == 0)
                    {
                        Monitor.Wait(_locker); //释放锁,并阻止当前线程,直到其他线程发送pulse信号。                    }
                    item = _itemQ.Dequeue();
                }

                if (item == null) return; //退出的信号
                item();
            }
        }
    }
</div>
我们可以有一个退出策略,插入一个null item作为consumer退出的信号。如果我们想要快速的退出,可以使用一个独立的”cancel” 标记,因为我们支持多个consumers,所以我们必须为每一个consumer插入一个null item。

下面是Main方法。使用两个consumer线程,然后让这两个consumers执行10个委托。

            for (int i = 0; i < 10; i++)
            {
                int itemNumber = i;
                q.EnqueueItem(() =>
                    {
                        Thread.Sleep(1000); //模拟耗时的工作
                        Console.WriteLine(" Task " + itemNumber);
                    });
 &

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 深入多线程之:深入生产者、消费者队列分析

相关文章

  • 2017-05-28C#获取任务栏显示进程的方法
  • 2017-05-28Stream.Write 与 StreamWriter.Write 的不同
  • 2017-05-28c#不使用windows api函数打开我的电脑和获取电脑驱动器信息
  • 2017-05-28C#实现windows form倒计时的方法
  • 2017-05-28详解C#中的Async和Await用法
  • 2017-05-28轻松学习C#的异常处理
  • 2017-05-28C# 泛型接口的抗变和协变
  • 2017-05-28C#函数式编程中的缓存技术详解
  • 2017-05-28C#中给Excel添加水印的具体方法
  • 2017-05-28C# TextBox 扩展方法数据验证详细说明

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C#启动windows服务方法的相关问题分析
    • C#实现获取一年中是第几个星期的方法
    • C# Redis学习系列(一)Redis下载安装使用
    • WinForm项目开发中Excel用法实例解析
    • word ppt excel文档转换成pdf的C#实现代码
    • C#中调用MySQL存储过程的方法
    • DevExpress实现TreeList父子节点CheckState状态同步的方法
    • DevExpress实现根据行,列索引来获取RepositoryItem的方法
    • C#实现类似新浪微博长URL转短地址的方法
    • C#实现DevExpress本地化实例详解

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有