C#集合之队列
队列是其元素按照先进先出(FIFO)的方式来处理的集合。
队列使用System.Collections.Generic名称空间中的泛型类Queue<T>实现。在内部,Queue<T>类使用T类型的数组,这类似List<T>(http://www.cnblogs.com/afei-24/p/6824791.html)类型。队列实现ICollection和IEnumerable<T>接口,但没有实现ICollection<T>接口,所以ICollection<T>接口定义的Add()合Remove()方法不能用于队列。
Enqueue()方法在队列的一端添加元素,Dequeue()方法在队列的另一端读取和删除元素。再次调用Dequeue(),会删除队列的下一个元素:
Queue<T>类的方法和属性:
在创建队列时,可以使用与List<T>类似的构造函数,也可以使用构造函数指定容量。
非泛型Queue类的默认构造函数不同,它会创建一个包含32项的空数组
下面用一个例子演示队列,使用一个线程将文档添加到队列中,用另一个线程从队列中读取文档,并处理:
//存储在队列中的元素是Document类型
public class Document
{
public string Title { get; private set; }
public string Content { get; private set; } public Document(string title, string content)
{
this.Title = title;
this.Content = content;
}
} //DocumentManager类是Queue<Document>外面的一层。用来如何将文档添加到队列和从队列中获取文档
public class DocumentManager
{
private readonly Queue<Document> documentQueue = new Queue<Document>(); //因为多个线程访问DocumentManager类,所以用lock语句锁定对队列的访问 public void AddDocument(Document doc)
{
lock (this)
{
documentQueue.Enqueue(doc);
}
} public Document GetDocument()
{
Document doc = null;
lock (this)
{
if (this.IsDocumentAvailable)
doc = documentQueue.Dequeue();
}
return doc;
} public bool IsDocumentAvailable
{
get
{
lock (this)
{
return documentQueue.Count > ;
} }
}
} //使用ProcessDocuments类在一个单独的任务中读取和删除队列中的文档。
public class ProcessDocuments
{
//能从外部访问的唯一方法是Start()方法
//在Start()中,实例化一个新任务。创建一个ProcessDocuments对象,调用ProcessDocuments的Run()方法
public static void Start(DocumentManager dm)
{
Task.Factory.StartNew(new ProcessDocuments(dm).Run);
} protected ProcessDocuments(DocumentManager dm)
{
if (dm == null)
throw new ArgumentNullException("dm");
documentManager = dm;
} private DocumentManager documentManager; //定义一个无限循环,使用DocumentManager类的IsDocumentAvailable属性确定队列中是否还有文档。
protected void Run()
{
while (true)
{
if (documentManager.IsDocumentAvailable)
{
Document doc = documentManager.GetDocument();
if(doc != null)
Console.WriteLine("Processing document {0}", doc.Title);
}
Thread.Sleep(new Random().Next());
}
}
}
客户端代码
static void Main()
{
var dm = new DocumentManager(); ProcessDocuments.Start(dm);
ProcessDocuments.Start(dm);
// Create documents and add them to the DocumentManager
for (int i = ; i < ; i++)
{
Document doc = new Document("Doc " + i.ToString(), "content");
dm.AddDocument(doc);
Console.WriteLine("Added document {0}", doc.Title);
Thread.Sleep(new Random().Next());
} Console.ReadKey();
}
C#集合之队列的更多相关文章
- Java 集合与队列的插入、删除在并发下的性能比较
这两天在写一个java多线程的爬虫,以广度优先爬取网页,设置两个缓存: 一个保存已经访问过的URL:vistedUrls 一个保存没有访问过的URL:unVistedUrls 需要爬取的数据量不大,对 ...
- .NET重思(三)-数组列表与数组的区别,栈集合和队列结合的区别
数组列表和数组十分相似,区别在于数组列表的容量是可以动态变化的,而数组的容量是固定的.数组即Array类,数组列表即ArrayList类,两者十分相似.不过,Array类在System命名空间下,Ar ...
- Stack集合 Queue队列集合 Hashtable哈希表
Stack集合 干草堆集合 栈集合 栈;stack,先进后出,一个一个赋值,一个一个取值,安装顺序来. 属性和方法 实例化 初始化 Stack st = new Stack(); 添加元素 个数 Co ...
- Java集合--阻塞队列及各种实现的解析
阻塞队列(Blocking Queue) 一.队列的定义 说的阻塞队列,就先了解下什么是队列,队列也是一种特殊的线性表结构,在线性表的基础上加了一条限制:那就是一端入队列,一端出队列,且需要遵循FIF ...
- C#泛型集合之——队列与堆栈
队列与堆栈基础 队列 1.操作: (1)创建及初始化: Queue<类型> 队列名 =new Queue<类型>()://空队列,无元素 Queue<类型> 队列名 ...
- 消息队列MQ集合
消息队列MQ集合 消息队列简介 kafka简介 Centos7部署zookeeper和Kafka集群 .
- C#学习总结之集合
一.集合接口和类型 命名空间: 集合类型 命名空间 一般集合 System.Collections 泛型集合 System.Collections.Generic 特定类型集合 Syst ...
- Java集合专题总结(1):HashMap 和 HashTable 源码学习和面试总结
2017年的秋招彻底结束了,感觉Java上面的最常见的集合相关的问题就是hash--系列和一些常用并发集合和队列,堆等结合算法一起考察,不完全统计,本人经历:先后百度.唯品会.58同城.新浪微博.趣分 ...
- 纸上谈兵:队列(queue)
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 队列(queue)是一个简单而常见的数据结构.队列也是有序的元素集合.队列最大的特 ...
随机推荐
- 最近公共祖先 LCA Tarjan算法
来自:http://www.cnblogs.com/ylfdrib/archive/2010/11/03/1867901.html 对于一棵有根树,就会有父亲结点,祖先结点,当然最近公共祖先就是这两个 ...
- Python代码规范利器Flake8
写代码其实是需要规范的,团队中更是如此:不然 Google 也不会发布各种编码规范,耳熟能详的有Google C++ 风格指南,Google Python 风格指南,等等. 这些规范有用吗?有用也没用 ...
- 文件上传控件asp:FileUpload
前端 使用的控件<asp:FileUpload ID="fileup" runat="server" /><span class=" ...
- 使用DBMS_SCHEDULER包管理计划任务
Dbms_scheduler是Oracle提供创建计划任务的包,任务类型可以是执行PL\SQL程序.执行外部脚本.调用操作系统命令,通常用于创建定期定时的任务,不依赖操作系统,保存在数据库内,数据库迁 ...
- 谈谈Vue.js——vue-resource全攻略
本篇文章主要介绍了谈谈Vue.js——vue-resource全攻略,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 概述 上一篇我们介绍了如何将$.ajax和Vue. ...
- 借助LVS+Keepalived实现负载均衡(转)
出处:http://www.cnblogs.com/edisonchou/p/4281978.html 一.负载均衡:必不可少的基础手段 1.1 找更多的牛来拉车吧 当前大多数的互联网系统都使用了服务 ...
- 对SOA架构思想的一些说明(转)
出处:http://kb.cnblogs.com/page/510698/ 从纵向到横向 传统业务系统的构建更多的是竖井式的纵向思想,这个主要是从单个业务系统孤立来看都是垂直应用.那么SOA架构的视角 ...
- eclipse查看jar包中的class文件出现乱码
参考:http://blog.csdn.net/bell2008/article/details/40978959 1,问题来源是在eclipse中直接查看springside的class(由ecli ...
- C#记录程序运行时间
主要:using System.Diagnostics;当中有Stopwatch类: 介绍如下: // 摘要: // 提供一组方法和属性,可用于准确地测量运行时间. public class Stop ...
- 深入理解java虚拟机(七)类加载的时机
Class 文件中描述的各种信息都必须加载到虚拟机中才能运行和使用.而虚拟机怎么加载这些Class 文件呢?Class 文件进入到虚拟机中会发生什么变化呢? 虚拟机类加载机制是指 虚拟机把描述类的数据 ...