多线程处理复杂计算,单线程输出顺序结果---一个苹果的加工过程
这个标题写的很抽象,一时间您可能不明白,什么是“多线程处理复杂计算,单线程输出顺序结果”。我先叙述一个场景说明吧。
苹果的加工过程,有一片苹果园,正在源源不断的长成熟新的苹果。苹果的加工有3道手续
0. 采摘入库,得到未清洗的新苹果,每个苹果都有顺序得到的新编号。
1. 处理每个苹果,清洗,消毒去垢等。
2. 将步骤1处理完成的苹果,按照采摘顺序逐个打上标签出售。
步骤0采摘与步骤2打标签的速度是超级快的,但是步骤1的处理就比较慢比较耗时。
解决方案,构造一个苹果队列用于存储苹果,步骤0顺序生成,步骤1多线程并非处理,步骤2顺序输出。
道理比较简单,接下来直接上图。
1.首先定义苹果对象。
1 public class Apple 2 { 3 4 public long ID { get; set; } 5 6 /// <summary> 7 /// 0初始,1去皮,2贴标签 8 /// </summary> 9 public int State { get; set; } 10 11 public string Name 12 { 13 get 14 { 15 switch (State) 16 { 17 case 0: 18 return "初始"; 19 case 1: 20 return "去皮"; 21 case 2: 22 return "贴标签"; 23 default: 24 return ""; 25 } 26 } 27 } 28 29 }
2.整体逻辑
1 public void Start() 2 { 3 //随机生成新苹果 4 new Thread(MakerAppleMethod).Start(); 5 6 //多线程去皮 7 new Thread(QuPiMethod).Start(); 8 9 //单线程贴标签 10 new Thread(DaoSuiMethod).Start(); 11 12 //监控 13 new Thread(EyeMethod).Start(); 14 }
3.生成苹果的线程
1 #region 1分钟生成20个苹果 2 3 public long MaxAppleId = 0; 4 public List<Apple> apples = new List<Apple>(); 5 6 public void MakerAppleMethod() 7 { 8 while (true) 9 { 10 Apple app = new Apple(); 11 app.ID = MaxAppleId++; 12 LogHelper.Log("生成苹果", $"{app.ID}生成苹果[{DateTime.Now.ToString("HH:m:s fff")}]"); 13 apples.Add(app); 14 Thread.Sleep(200); 15 } 16 } 17 18 #endregion

4. 苹果清理的过程
1 /// <summary> 2 /// 多线程去皮 3 /// </summary> 4 private void QuPiMethod() 5 { 6 while (true) 7 { 8 var applist = apples.ToArray().Take(20).Where(o => o.State == 0).ToList(); 9 List<Task>taskList=new List<Task>(); 10 foreach (var apple in applist) 11 { 12 Task task=new Task(delegate() 13 { 14 #region 去皮过程 15 var wait = mRad.Next(9999); 16 Thread.Sleep(wait); 17 apple.State = 1; 18 LogHelper.Log("去皮", $"{apple.ID}完成去皮[{DateTime.Now.ToString("HH:m:s fff")}]"); 19 20 #endregion 21 }); 22 task.Start(); 23 taskList.Add(task); 24 } 25 Task.WaitAll(taskList.ToArray()); 26 Thread.Sleep(20); 27 } 28 }

5. 贴标签线程
1 /// <summary> 2 /// 单线程按照顺序贴标签 3 /// </summary> 4 private void DaoSuiMethod() 5 { 6 while (true) 7 { 8 if (apples.Count>0&&apples[0].State==1) 9 { 10 #region 捣碎过程 11 12 apples[0].State = 2; 13 LogHelper.Log("贴标签", $"{apples[0].ID}完成贴标签[{DateTime.Now.ToString("HH:m:s fff")}]"); 14 apples.RemoveAt(0); 15 16 #endregion 17 } 18 else 19 { 20 Thread.Sleep(10); 21 } 22 } 23 }

6.全局监控线程
1 /// <summary> 2 /// 监控 3 /// </summary> 4 private void EyeMethod() 5 { 6 while (true) 7 { 8 string msg = string.Empty; 9 var group = apples.ToArray().GroupBy(o => o.State); 10 foreach (var gg in group) 11 { 12 var item = gg.ToList(); 13 msg += item[0].Name + ":" + item.Count + "\t\t"; 14 } 15 LogHelper.Log("EYE",msg); 16 Thread.Sleep(1000); 17 } 18 }
完成~~~
微信:xujianshi2012

浙公网安备 33010602011771号