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