双Queue交替使用(C#)

引用内容 引用内容
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

    class Program
    {
        static HandlerQueue queue1 = new HandlerQueue("queue1@@");
        static HandlerQueue queue2 = new HandlerQueue("Queue2==");
        static void Main(string[] args)
        {
            Thread tin = new Thread(DoEnQueue);
            Thread tin1 = new Thread(DoEnQueue);
            Thread tin2 = new Thread(DoEnQueue);
            Thread tout = new Thread(new ThreadStart(DoDeQueue));
            tin.Start(1000);
            tin1.Start(100);
            tin2.Start(10000);
            tout.Start();
            System.Console.ReadLine();
        }
        protected static void DoDeQueue()
        {
            while (true)
            {
                Data d = null;
                HandlerQueue tem_queue = null;
                queue1.Reset();
                queue2.Reset();
                if (!queue1.EnQueuing && queue1.Count > 0)
                {
                    queue1.DeQueuing = true;
                    queue2.DeQueuing = false;
                    d = queue1.DeQueue();
                    tem_queue = queue1;
                }
                else if (!queue2.EnQueuing && queue2.Count > 0)
                {
                    queue2.DeQueuing = true;
                    queue1.DeQueuing = false;
                    d = queue2.DeQueue();
                    tem_queue = queue2;
                }

                if (d != null)
                {
                    //Logger.Write(Level.Info, string.Format("============[{0}]DeQueue:Id:{1},Name:{2}", tem_queue.QueueName, d.Id, d.Name));
                    System.Console.WriteLine(string.Format("{0}============[{1}]DeQueue:Id:{2},Name:{3}", DateTime.Now.Ticks, tem_queue.QueueName, d.Id, d.Name));
                    //Thread.Sleep(100);
                }
                else
                {
                    Thread.Sleep(100);
                }
            }
        }
        protected static void DoEnQueue(object limit)
        {
            int maxCnt = 5;
            while (true)
            {
                Random r = new Random();
                int lt = Int32.Parse(limit.ToString());
                int rr = r.Next(lt);
                HandlerQueue tem_queue = null;
                if (queue1.Count < maxCnt && !queue2.EnQueuing && !queue2.DeQueuing)
                {
                    if (!queue1.EnQueuing)
                    {
                        queue1.Clear();
                        queue1.EnQueuing = true;
                        queue2.EnQueuing = false;
                    }
                    queue1.EnQueue(new Data(rr, rr.ToString()));
                    tem_queue = queue1;
                    //Logger.Write(Level.Info, string.Format("条件1"));
                }
                else if (queue1.Count >= maxCnt || (!queue2.DeQueuing && queue2.Count <= maxCnt))
                {
                    if (!queue2.EnQueuing)
                    {
                        queue2.Clear();
                        queue2.EnQueuing = true;
                        queue1.EnQueuing = false;
                    }
                    queue2.EnQueue(new Data(rr, rr.ToString()));
                    tem_queue = queue2;
                    //Logger.Write(Level.Info, string.Format("条件2"));
                }
                else if (queue2.Count >= maxCnt || (!queue1.DeQueuing && queue1.Count <= maxCnt))
                {
                    if (!queue1.EnQueuing)
                    {
                        queue1.Clear();
                        queue1.EnQueuing = true;
                        queue2.EnQueuing = false;
                    }
                    queue1.EnQueue(new Data(rr, rr.ToString()));
                    tem_queue = queue1;
                    //Logger.Write(Level.Info, string.Format("条件3"));
                }
                else
                {
                    //Logger.Write(Level.Info, string.Format("Lost EnQueue,queue1:[EnQueuing:{0},DeQueuing:{1},Count:{2}],Queue2:[EnQueuing:{3},DeQueuing:{4},Count:{5}]", queue1.EnQueuing, queue1.DeQueuing, queue1.Count, queue2.EnQueuing, queue2.DeQueuing, queue2.Count));
                    System.Console.WriteLine(string.Format("Lost EnQueue,queue1:[EnQueuing:{0},DeQueuing:{1},Count:{2}],Queue2:[EnQueuing:{3},DeQueuing:{4},Count:{5}]", queue1.EnQueuing, queue1.DeQueuing, queue1.Count, queue2.EnQueuing, queue2.DeQueuing, queue2.Count));
                }
                try
                {
                    //System.Console.WriteLine(string.Format("EnQueue:Id:{0},Name:{1}", rr, rr));
                    //Logger.Write(Level.Info, string.Format("[{0}]EnQueue:Id:{1},Name:{2}", tem_queue.QueueName, rr, rr));
                    System.Console.WriteLine(string.Format("{0}-[{1}]EnQueue:Id:{2},Name:{3}",DateTime.Now.Ticks, tem_queue.QueueName, rr, rr));
                }
                catch { }
                Thread.Sleep(100);
            }
        }
    }
    public class HandlerQueue
    {
        private Queue<Data> queue = null;
        private static volatile object o = new object();
        private static volatile object o1 = new object();
        private static volatile object oc = new object();
        public string QueueName
        {
            get;
            set;
        }
        public HandlerQueue(string queueName)
        {
            this.QueueName = queueName;
            this.queue = new Queue<Data>();
            this.EnQueuing = false;
            this.DeQueuing = false;
        }
        /// <summary>
        /// 进栈
        /// </summary>
        /// <param name="data"></param>
        public void EnQueue(Data data)
        {
            lock (o)
            {
                queue.Enqueue(data);
            }
        }
        /// <summary>
        /// 出栈
        /// </summary>
        /// <returns></returns>
        public Data DeQueue()
        {
            lock (o1)
            {
                if (queue.Count > 0)
                {
                    return queue.Dequeue();
                }
            }
            return null;
        }
        /// <summary>
        /// 获得数量
        /// </summary>
        /// <returns></returns>
        public int Count
        {
            get
            {
                return queue.Count;
            }
        }
        /// <summary>
        /// 清理Queue
        /// </summary>
        public void Clear()
        {
            queue.Clear();
        }
        /// <summary>
        /// 是否在进栈
        /// </summary>
        public bool EnQueuing
        {
            get;
            set;
        }
        /// <summary>
        /// 是否在出栈
        /// </summary>
        public bool DeQueuing
        {
            get;
            set;
        }
        /// <summary>
        /// 重置
        /// </summary>
        public void Reset()
        {
            if (this.Count == 0)
            {
                this.DeQueuing = false;
            }
        }
    }
    public class Data
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public Data()
        {
        }
        public Data(int id, string name)
        {
            this.Id = id;
            this.Name = name;
        }
    }

工作机理就是线程1给其中一个Queue1推新数据,当Queue1满了,则线程1给Queue2填充数据,而线程二开始将Queue1的数据推出,交替使用Queue

[本日志由 PaulLeder 于 2010-06-27 02:56 PM 编辑]
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags:
相关日志:
评论: 0 | 引用: 0 | 查看次数: 92
发表评论
昵 称:
密 码: 游客发言不需要密码.
内 容:
验证码: 验证码
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.
字数限制 1000 字 | UBB代码 开启 | [img]标签 关闭