zoukankan      html  css  js  c++  java
  • 线程相关技术

    线程

    线程池

    线程同步

    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、消息队列挂掉怎么办?需要持久化支持

  • 相关阅读:
    HDU1548:A strange lift
    hdu1978_How many ways dfs+记忆化搜索
    HDU1518:Square(DFS)
    HDU ACM 1495 非常可乐(广搜BFS)
    HDU1372:Knight Moves(BFS)
    662_二叉树最大宽度
    590_N叉树的后序遍历
    一直在坚持
    动态链接库DLL的操作顺序
    最近木马的查杀方法/各类杀毒软件的使用
  • 原文地址:https://www.cnblogs.com/tanl/p/12501915.html
Copyright © 2011-2022 走看看