Queue学习

一,队列的实现并发

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace bingfa
{
    class Program
    {
        //实例引用类型的私有对象,用来实现锁的操做,当这个对象释放,下一个才能够调用锁住的方法
        private static object o = new object(); 

        static void Main(string[] args)
        {
            //开启线程监听
            UserHelper.Instance.Start();

            //实现多并发
            Task t1 = Task.Factory.StartNew(() =>
            {
                AddUser();
            });
            Task t2 = Task.Factory.StartNew(() =>
            {
                AddUser();
            });
            Task.WaitAll(t1, t2);

            Console.ReadKey();
        }

        //集合数据添加操做
        static void AddUser()
        {
            Parallel.For(0, 10, (i) =>
            {
                lock (o)   // 添加锁,避免丢失
                {
                    UserHelper.Instance.AddQueue("Name" + i);
                }
            });
        }
    }

    //队列临时类  
    public class UserInfo
    {
        public string Name { get; set; }
    }

    public class UserHelper
    {
        #region 使用队列和锁,实现当多并发是出现的请求丢失

        public readonly static UserHelper Instance = new UserHelper();
        private UserHelper()
        { }

        private Queue<UserInfo> LQueue = new Queue<UserInfo>();

        public void AddQueue(string Name) //入列  
        {
            UserInfo qinfo = new UserInfo();
            qinfo.Name = Name;
            LQueue.Enqueue(qinfo); 
        }

        public void Start()//启动线程  
        {
            Thread thread = new Thread(threadStart);
            thread.IsBackground = true;
            thread.Start();
        }

        private void threadStart() //现成监听方法
        {
            while (true)
            {
                if (LQueue.Count > 0)
                {
                    try
                    {
                        ShowQueue();
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.ToString());
                    }
                }
                else
                {
                    //没有任务,休息3秒钟  
                    Thread.Sleep(3000);
                }
            }
        }

        //执行的方法,便是当有对象进入队列的实现方法
        private void ShowQueue()   
        {
            while (LQueue.Count > 0)
            {
                try
                {
                    //从队列中取出数据进行操做 
                    UserInfo qinfo = LQueue.Dequeue();
                    Console.WriteLine(qinfo.Name);

                }
                catch (Exception ex)
                {
                    throw;
                }
            }
        }

        #endregion
    }
}
相关文章
相关标签/搜索