C#的队列(Queue,ConcurrentQueue)和堆栈(Stack,ConcurrentStack)

摘要:
一、Queue表示对象的先进先出(FIFO)集合,非线程安全常用方法Dequeue入队Enqueue出队Contains队列中是否存在某元素Clear清空队列封装://////QueuePool(先进先出)//////表示泛型,QueuePool中元素的类型publicclassQueuePool˂

一、Queue

表示对象的先进先出(FIFO)集合,非线程安全

常用方法
Dequeue入队
Enqueue出队
Contains队列中是否存在某元素
Clear清空队列

封装:

    /// <summary>
    /// QueuePool(先进先出)
    /// </summary>
    /// <typeparam name="T">表示泛型,QueuePool中元素的类型</typeparam>
    public class QueuePool<T>
    {
        private Queue<T> myPool = null;
        /// <summary>
        /// 按照设定的大小初始化 QueuePool 
        /// </summary>
        /// <param name="capacity"> QueuePool 最大容量</param>
        public QueuePool(int capacity)
        {
            myPool = new Queue<T>(capacity);
        }
        /// <summary>
        /// 向 QueuePool 中添加对象
        /// </summary>
        /// <param name="item">待添加对象</param>
        public void Enqueue(T item)
        {
            if (item == null)
                throw new ArgumentNullException("Items added to a QueuePool cannot be null");
            lock (myPool)
            {
                myPool.Enqueue(item);
            }
        }
        /// <summary>
        /// 向 QueuePool 中提取对象,并移除该对象
        /// </summary>
        /// <returns>提取出来的对象</returns>
        public T Dequeue()
        {
            lock (myPool)
            {
                return myPool.Dequeue();
            }
        }
        /// <summary>
        /// 向 QueuePool 中提取对象,但不移除该对象
        /// </summary>
        /// <returns>提取出来的对象</returns>
        public T Peek()
        {
            lock (myPool)
            {
                return myPool.Peek();
            }
        }
        /// <summary>
        /// 从 QueuePool 中移除所有的对象。
        /// </summary>
        public void Clear()
        {
            lock (myPool)
            {
                myPool.Clear();
            }
        }
        /// <summary>
        /// 判断某个对象是否在 QueuePool 中
        /// </summary>
        public bool Contains(T item)
        {
            lock (myPool)
            {
                return myPool.Contains(item);
            }
        }
        /// <summary>
        /// 获取 QueuePool 中包含的对象个数
        /// </summary>
        public int Count { get => myPool.Count(); }
    }

二、Stack

表示对象的简单后进先出 (LIFO) 非泛型集合,非线程安全

常用方法
Push入栈
Pop出栈
Contains堆栈中是否存在某元素
Clear清空堆栈

封装:

    /// <summary>
    /// StackPool(后进先出)
    /// </summary>
    /// <typeparam name="T">表示泛型,StackPool中元素的类型</typeparam>
    public class StackPool<T>
    {
        private Stack<T> myPool = null;
        /// <summary>
        /// 按照设定的大小初始化 StackPool 
        /// </summary>
        /// <param name="capacity"> StackPool 最大容量</param>
        public StackPool(int capacity)
        {
            myPool = new Stack<T>(capacity);
        }
        /// <summary>
        /// 向 StackPool 中添加对象
        /// </summary>
        /// <param name="item">待添加对象</param>
        public void Push(T item)
        {
            if (item == null)
                throw new ArgumentNullException("Items added to a StackPool cannot be null");
            lock (myPool)
            {
                myPool.Push(item);
            }
        }
        /// <summary>
        /// 向 StackPool 中提取对象,并移除该对象
        /// </summary>
        /// <returns>提取出来的对象</returns>
        public T Pop()
        {
            lock (myPool)
            {
                return myPool.Pop();
            }
        }
        /// <summary>
        /// 向 StackPool 中提取对象,但不移除该对象
        /// </summary>
        /// <returns>提取出来的对象</returns>
        public T Peek()
        {
            lock (myPool)
            {
                return myPool.Peek();
            }
        }
        /// <summary>
        /// 从 StackPool 中移除所有的对象。
        /// </summary>
        public void Clear()
        {
            lock (myPool)
            {
                myPool.Clear();
            }
        }
        /// <summary>
        /// 判断某个对象是否在 StackPool 中
        /// </summary>
        public bool Contains(T item)
        {
            lock (myPool)
            {
                return myPool.Contains(item);
            }
        }
        /// <summary>
        /// 获取 StackPool 中包含的对象个数
        /// </summary>
        public int Count { get => myPool.Count(); }
    }

三、ConcurrentQueue

表示线程安全的先进先出 (FIFO) 集合

常用方法

Dequeue

入队

TryDequeue(T)

出队

四、ConCurrentStack

表示线程安全的后进先出 (LIFO) 集合

常用方法

Push

入栈

TryPop(T)

出栈

免责声明:文章转载自《C#的队列(Queue,ConcurrentQueue)和堆栈(Stack,ConcurrentStack)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇System.Net.Mail.SmtpClient通过SSL/TLS协议发送邮件失败问题解决JS组件系列——封装自己的JS组件下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

dump解析入门-用VS解析dump文件进行排障

突然有一天部署在服务器的一个应用挂掉了,没办法只能进入服务器打开 【事件查看器】查看下,好不容易找到了打开后一脸懵逼 事件查看器查到的内容根本对我们排障没有任何作用。 在这个时候如果有对应的dump文件就能派上用场了, 只要有dump文件就能查到应用挂掉那刻的一手情报,可能有人认为分析dump文件是非常难的事情, 但是最近不断有新的dump分析工具出来...

GDB调试汇编堆栈过程分析

GDB调试汇编堆栈 准备工作 · 终端编译工具: ·         编译64位Linux版本32位的二进制文件,需要安装一个库,使用指令sudo apt-get install libc6-dev-i386 分析过程 ·         1.生成汇编代码:gcc -g test.c -o test -m32 ·         2.调试:gdb test...

linux c 用户态调试追踪函数调用堆栈以及定位段错误[转载]

一般察看函数运行时堆栈的方法是使用GDB(bt命令)之类的外部调试器,但是,有些时候为了分析程序的BUG,(主要针对长时间运行程序的分析),在程序出错时打印出函数的调用堆栈是非常有用的。 在glibc头文件"execinfo.h"中声明了三个函数用于获取当前线程的函数调用堆栈。 int backtrace(void **buffer,int size) 该...

【转】jstack命令的使用

jstack是java虚拟机自带的一种堆栈跟踪工具。 jstack用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因, 如线程间死锁、死循环、请求外部资源导致的长时间等待等。 线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没...

VC终止线程,ExitThread函数,Te r m i n a t e T h r e a d函数,撤消线程,详解

VC-终止线程,ExitThread函数,Te r m i n a t e T h r e a d函数,撤消线程,详解 6.5 终止线程的运行 若要终止线程的运行,可以使用下面的方法: •  线程函数返回(最好使用这种方法)。 •  通过调用E x i t T h r e a d函数,线程将自行撤消(最好不要使用这种方法)。 •  同一个进程或另一个进程中的...

Java进程CPU100%的问题

今天review了一下测试环境,后来发现一个java进程CPU 120%多,4核的CPU,很多人都没感觉。但是确实是很大问题。测试环境没什么并发,也没什么数据量怎么会这么高的cpu呢? 找到java进程中耗cpu最高的nid, top –p pid –H 用jstack或者其他方式打印一下线程堆栈,从堆栈记录里找出nid,对应的线程和他的堆栈。找到出问题...