


下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、.NET(C#) :使用线程安全集合快速解决生产者消费者问题程序演示:进入程序,首先得输入最大容量,比如输入10:接下来生产线生成了,最初当然只有 0 始生产 5 个项目,在“生产数量”中输入个项目,我们现在开5,如下图:然后点击“生产” , 5 个项目就被生产了:接下来我们再生产12 个项目,加上之前的5 个项目,此时一共会生产17 个项目,但是总容量是10,所以会有7 个生产项目要等待(线程阻塞):接着再去生产 10 个项目,此时已经有状态,后续的生产项目需求会叠加:7 个生产项目在等待现在的情况是:有 10 个项目已经被生产,还有待被生产,下面我们消费 5 个项目,结果如下:17 个项目
2、等当 5 个项目被消费后,等待生产的项目立即开始生产,知道容量又一次到最大值 10,而左面等待生产的项目个数变成了12(减少了 5 个)。下面直接消费100 个,结果:由于之前有10 个被生产, 12 个在等待生产, 所以等着22 个项目被消费后,后续的消费无法满足,因此有 78 个消费在等待。最后再生产80 个项目,其中78 个会被消费,然后剩2 个留在生产线上,如下图:生产着消费者问题有非常多的解决方式,不过使用 .NET 4.0+的线程安全集合解决起来非常简单。用户不需要自定义线程同步逻辑,直接使用线程安全集合,然后多线程去操作就可以了,当然,更具体些,使用BlockingCollect
3、ion ,它本身不是严格意义上的集合,而是包转另一个线程安全集合使他具备阻塞功能。使用 BlockingCollection 来定义整个生产线集合。接着生产和消费问题就是在这个阻塞集合中进行添加和删除操作,这里我们会继承 BlockingCollection 得天独厚的优点,当向已满的集合中添加值,或者向空集合中删除值都会造成操作线程阻塞,知道该需求被完成,否则操作线程一直阻塞下去。整个执行上核心就两个类:Operator 和 RequestItem。Operator 包含着 BlockingCollection ,并提供封装方法来调用 BlockingCollection 的 Add 和 T
4、ake 来进行生产和消费操作。任何操作都被 RequestItem 来代表,这个类型存储着操作次数,就是“生产 5 个项目”中的 5。对于可以完成的命令, BlockingCollection 显然不会阻塞, 然后根据操作次数执行生产或者消费操作,最后 RequestItem 会被删除掉。但是如果命令无法得到满足,此时 BlockCollection 会阻塞,相应的RequestItem 也会留下, 操作次数则代表等待的工作数,同时RequestItem 也可以叠加。可以参考下图:执行上差不多这些,在界面更新上,Operator 和 RequestItem均继承 INotifyProperty
5、Changed接口来通知WPF 属性变化,同时生产和消费等待队列被存到Operator中的ObservableCollection中,有点像MVVM中的ViewModel,但程序没有用严格的MVVM模式来写。Operator 类型:Consumers 属性代表消费等待队列。Producers 属性代表生产等待队列。Count 和 Capacity 分别代表当前生产线项目个数和总容量。注意由于总容量Capacity 不会变因此没必要像Count 属性那样进行改变通知。public ObservableCollection<RequestItem> Consumers
6、get; private set; public ObservableCollection<RequestItem> Producers get; private set; public int Capacity get; private set; #region Countprivate int _Count = 0;public int Countget return _Count; protected setif (_Count != value)_Count = value;OnPropertyChanged("Count");Reque
7、stItem 则更简单了,只有一个Count 属性代表操作数。最后生产或者消费操作的执行就顺水推舟了,我们以生产方法: Produce 来示例(代码中有注释) :public void Produce(int count)/用另一个线程来操作BlockingCollectionTask.Factory.StartNew() =>/生成 RequestItemvar item = new RequestItem(count);/将 RequestItem 加入到生产等待队列中/UIAction方法是用WPF 间接调用 WPF Dispatcher的 Invoke 相关操作UIAct
8、ion() => Producers.Add(item);/尝试进行生产操作for (int i = 0; i < count; i+)/调用内部 BlockingCollection的 Add 方法blockingQueue.Add(0);/重要:此时代码运行到这说明没有阻塞,那么生产成功UIAction() =>/将等待操作数减1-item.Count;/将生产线项目个数加1+Count;);/所有生产需求均被完成,将此生产需求从队列中移除UIAction() => Producers.Remove(item););OK ,程序整体框架差不多是这样
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中国饮用水桶行业市场前景预测及投资价值评估分析报告
- 2025至2030年中国滚动式烤香肠机行业投资前景及策略咨询研究报告
- 新乡卫飞商贸有限公司介绍企业发展分析报告
- 2025年钢管项目可行性报告
- 环保型施工技术与噪音减少行动计划
- 国际交流项目语言辅导计划
- 中式烹调师客户服务与满意度提升计划
- 2025年喷雾通风冷却塔项目规划申请报告模板
- 2025年餐厨垃圾处理项目可行性分析报告
- 幼儿园小班社会行为培养计划
- 单位驾驶员劳务派遣投标方案投标文件(技术方案)
- 资本经营-终结性考试-国开(SC)-参考资料
- 2024年浙江省中考科学试卷
- 拆除工程地坪拆除施工方案
- 软件授权书范本
- 招聘笔试题与参考答案(某大型国企)2025年
- DB34∕T 2570-2015 祁红香螺加工技术规程
- 安徽合肥滨湖投资控股集团有限公司招聘笔试题库2024
- 2024年四年级英语下册 Module 4 Things we enjoy Unit 12 The ugly duckling第3课时教案 牛津沪教版(三起)
- 2024年铁路职业技能竞赛(线路工)理论考试题库及答案
- 六年级毕业测试卷(道德与法治)【实验班】
评论
0/150
提交评论