多线程处理复杂计算,单线程输出顺序结果---一个苹果的加工过程

这个标题写的很抽象,一时间您可能不明白,什么是“多线程处理复杂计算,单线程输出顺序结果”。我先叙述一个场景说明吧。

苹果的加工过程,有一片苹果园,正在源源不断的长成熟新的苹果。苹果的加工有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         }

 

 

 

完成~~~

 

posted @ 2017-06-12 22:50  小徐科技xiaoxu.pub  阅读(162)  评论(0)    收藏  举报