线程相关技术

线程

线程池

线程同步

http://dotnetpattern.com/threading-synchronization

https://www.cnblogs.com/wyt007/p/9486752.html

 

线程队列

使用一个线程专门完成某种任务。可以实现多并发下性能控制。

    /// <summary>
    /// 线程工作队列
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class ThreadWorkQueue<T>
    {
        public Action<T> OnDequeue { get; set; }

        /// <summary>
        /// 开始线程,初始化线程
        /// </summary>
        public void Init()
        {
            _pQueue = new Queue<T>();
            _hasTask = new ManualResetEvent(false);

            _taskThread = new Thread(Process)
            {
                IsBackground = true
            };
            _taskThread.Start();
        }

        /// <summary>
        ///  添加任务
        /// </summary>
        /// <param name="param"></param>
        public void AddTask(T param)
        {
            _pQueue.Enqueue(param);
            //LogHelper.Info("-- 任务开始 Set Start--");
            _hasTask.Set();
        }

        /// <summary>
        /// 任务队列
        /// </summary>
        private Queue<T> _pQueue;

        /// <summary>
        ///  用于通知是否有新数据要处理的“信号器”
        ///  AutoResetEvent 接收一次set信号后会自动reset
        ///  ManualResetEvent
        /// </summary>
        private ManualResetEvent _hasTask;

        /// <summary>
        /// 用于处理任务的线程
        /// </summary>
        private Thread _taskThread;

        /// <summary>
        /// 理队列中的任务
        /// </summary>
        private void Process()
        {
            while (true)
            {
                try
                {
                    // 等待接收信号,阻塞线程。
                    //LogHelper.Info("-- 任务开始 WaitOne Start--");
                    _hasTask.WaitOne();

                    var p = _pQueue.Dequeue();
                    if (_pQueue.Count < 1)
                    {
                        _hasTask.Reset();
                    }
                    OnDequeue(p);
                }
                catch (ThreadAbortException ex)
                {
                    //LogHelper.Error("主处理进程错误 ThreadAbortException", ex);
                    throw ex;
                }
                catch (Exception ex)
                {
                    //LogHelper.Error("主处理进程错误", ex);
                }
            }
        }

    }

 

消息队列

市面上比较主流的消息队列中间件
Kafka、ActiveMQ、RabbitMQ、RocketMQ

常见使用场景:
日志 短信 等

好处:
1、解耦 增加一个中间件 将多对多变为一对多
2、提速 随取随用
3、广播 不用通知对应的人
4、削峰 可以更平稳的处理数据
5、异步 一个功能的后续事件太多的时候,使用异步。

缺点:
1、引入复杂度
2、丧失及时性
3、生产者不需要知道消费者的回调
4、后续失败了怎么处理
5、消息队列挂掉怎么办?需要持久化支持

 

posted @ 2020-03-16 09:30  胡正  阅读(156)  评论(0编辑  收藏  举报