本文转载自微信公众号「后端Q」,作者conan。转载本文请联系后端Q公众号。
多线程(multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理或同时多线程处理器。在一个程序中,这些独立运行的程序片段叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理”。
队列(Queue)代表了一个先进先出的对象集合。当您需要对各项进行先进先出的访问时,则使用队列。当您在列表中添加一项,称为入队,当您从列表中移除一项时,称为出队。
比如平常我们在处理定时任务的时候,假设就一台机器,我们不可能单线程一条一条数据的去跑,这时候就需要提高机器资源的利用率。
下面我们来介绍下,如何实现多线程+队列以提高并发处理能力。
1、定义线程数threadNum和队列queues
- /// <summary>
- /// 线程总数
- /// </summary>
- private int threadNum = 4;
- /// <summary>
- /// 总数
- /// </summary>
- private int totalCount = 0;
- /// <summary>
- /// 已处理
- /// </summary>
- private int index = 0;
- /// <summary>
- /// 队列
- /// </summary>
- private ConcurrentQueue<AssetRepayment> queues = new ConcurrentQueue<AssetRepayment>();
2、定义线程列表,往线程添加数据
- public void SubDeTransaction()
- {
- var list = new List<AssetRepayment>();
- for (int i = 0; i < 1000; i++)
- {
- list.Add(new AssetRepayment() { Title = i.ToString() + "---" + Guid.NewGuid().ToString() });
- }
- if (list == null || list.Count() == 0)
- {
- Console.WriteLine("没有可执行的数据");
- return;
- }
- totalCount = list.Count;
- Console.WriteLine("可执行的数据:" + list.Count() + "条");
- foreach (var item in list)
- {
- queues.Enqueue(item);
- }
- List<Task> tasks = new List<Task>();
- for (int i = 0; i < threadNum; i++)
- {
- var task = Task.Run(() =>
- {
- Process();
- });
- tasks.Add(task);
- }
- var taskList = Task.Factory.ContinueWhenAll(tasks.ToArray(), (ts) =>
- {
- });
- taskList.Wait();
- }
3、对线程数进行限制 for (int i = 0; i < threadNum; i++)
- var taskList = Task.Factory.ContinueWhenAll(tasks.ToArray(), (ts) =>
- {
- });
- taskList.Wait();
4、从队列取出数据进行业务处理
- private void Process()
- {
- while (true)
- {
- var currentIndex = Interlocked.Increment(ref index);
- AssetRepayment repayId = null;
- var isExit = queues.TryDequeue(out repayId);
- if (!isExit)
- {
- break;
- }
- try
- {
- Console.WriteLine(repayId.Title);
- Console.WriteLine(string.Format(" 共{0}条 当前第{1}条", totalCount, currentIndex));
- }
- catch (Exception ex)
- {
- Console.WriteLine(ex);
- }
- }
- }
运行测试
https://gitee.com/conanOpenSource_admin/Example
你是否曾梦想用代码改变世界? 你是否曾胸怀满腔的开发热血? 如果你的回答是Yes...
1.别和我谈恋爱,虚伪,有本事咱俩结婚。 2.我在减肥,我既不节食也不运动,我...
转载自 https://github.com/maemual/raft-zh_cn/blob/master/raft-zh_cn.md 1 介...
难得请了年假 躺在阳光海浪仙人掌的沙滩上喝着椰汁 突然接到系统报警电话 立刻跳...
本文转载自微信公众号「程序喵大人」,作者程序喵大人。转载本文请联系程序喵大...
2021年3月25日,亚马逊云科技今天在北京举行媒体沟通会,首次正式发布三驾马车,...
鱼皮结合自己的大学经历,现身说法! 时间好快呀,鱼皮的老弟小阿巴已经在大学读...
“在客户面前产品架构师就像特种兵的角色,直面一线战况,快速做出决策并且把明...
构建便捷可及的“大服务”体系、规范高效的“大经办”体系、智能精准的“大治理...
对于许多组织来说,在冠状病毒疫情持续蔓延期间,云计算和边缘计算对维持其业务...