zoukankan      html  css  js  c++  java
  • 阻塞队列

    <summary>
        /// 阻塞队列
        /// </summary>
        public class BlockQueue<T>
        {
            public readonly int SizeLimit = 0;
            private Queue<T> _inner_queue = null;
            public int Count
            {
                get { return _inner_queue.Count; }
            }
            private ManualResetEvent _enqueue_wait = null;
            private ManualResetEvent _dequeue_wait = null;
            public BlockQueue(int sizeLimit)
            {
                this.SizeLimit = sizeLimit;
                this._inner_queue = new Queue<T>(this.SizeLimit);
                this._enqueue_wait = new ManualResetEvent(false);
                this._dequeue_wait = new ManualResetEvent(false);
            }
            public void EnQueue(T item)
            {
                if (this._IsShutdown == true) throw new InvalidCastException("Queue was shutdown. Enqueue was not allowed.");
                while (true)
                {
                    lock (this._inner_queue)
                    {
                        if (this._inner_queue.Count < this.SizeLimit)
                        {
                            this._inner_queue.Enqueue(item);
                            this._enqueue_wait.Reset();
                            this._dequeue_wait.Set();
                            break;
                        }
                    }
                    this._enqueue_wait.WaitOne();
                }
            }
            public T DeQueue()
            {
                while (true)
                {
                    if (this._IsShutdown == true)
                    {
                        lock (this._inner_queue) return this._inner_queue.Dequeue();
                    }
                    lock (this._inner_queue)
                    {
                        if (this._inner_queue.Count > 0)
                        {
                            T item = this._inner_queue.Dequeue();
                            this._dequeue_wait.Reset();
                            this._enqueue_wait.Set();
                            return item;
                        }
                    }
                    this._dequeue_wait.WaitOne();
                }
            }
            private bool _IsShutdown = false;
            public void Shutdown()
            {
                this._IsShutdown = true;
                this._dequeue_wait.Set();
            }
        }
  • 相关阅读:
    Java FileInputStream与FileReader的区别
    java 保存和读取本地json文件
    java写文件时往末尾追加文件(而不是覆盖原文件),的两种方法总结
    Java魔法堂:注解用法详解——@SuppressWarnings
    使用Restlet Client发送各种Get和Post请求
    postman VS restlet client基本使用
    Java获取请求客户端的真实IP地址
    dom4j解析xml字符串实例
    C++ Boost库简介(一些自己的感受)
    打仗其实最讲成本核算,大炮轰的都是黄金,日军在中国就是不断赔本
  • 原文地址:https://www.cnblogs.com/fx2008/p/2258340.html
Copyright © 2011-2022 走看看