你程序会做饭嘛?我其实是这样做的

开发 项目管理
别嘲笑这个标题。我想了很久。有点“投机取巧”的功效吧!

[[134565]]

程序当然不能做饭。

之前的我们的系列文章,介绍, 多线程执行,任务派发。定时器执行。脚本加载。程序状态机。

这些都是零零散散,或者说都是模块化介绍,以及模块测试用例。

那么今天我们就来模拟正常程序流程。使用上述的功能性代码完成流程。

当然今天的测试用例程序肯定和做饭有关。今天要做的是模拟一个餐厅的流程。

完成 客人入座 -> 点菜 -> 等待就餐 -> 就餐 -> 等待结账 -> 结账 -> 离开.

期间包括 等待就餐 添加茶水,就餐的添加茶水,添加米饭等随机事件

新建控制台项目:

Sz.Network.DiningRoom 用于存放主文件项目

类库

Sz.Network.DiningRoom.Scripts  用于存放脚本文件项目

我们先来初始化餐厅。 

  1. /** 
  2.  *  
  3.  * @author 失足程序员 
  4.  * @Blog http://www.cnblogs.com/ty408/ 
  5.  * @mail 492794628@qq.com 
  6.  * @phone 13882122019 
  7.  *  
  8.  */ 
  9. namespace Sz.Network.DiningRoom 
  10.  
  11.     /// <summary> 
  12.     ///  
  13.     /// </summary> 
  14.     public class 餐厅 
  15.     { 
  16.  
  17.         private static 餐厅 instance = new 餐厅(); 
  18.  
  19.         public static 餐厅 GetInstance { get { return instance; } } 
  20.  
  21.         public long 全局线程 = 0
  22.         public long 厨师s = 0
  23.         public long 传菜员s = 0
  24.         public long 服务员s = 0
  25.         public long 配菜员s = 0
  26.         public long 收银员s = 0
  27.         public long 洗菜员s = 0
  28.  
  29.         public 客人[] table = null
  30.  
  31.  
  32.         public void Init(int tableSize) 
  33.         { 
  34.             Logger.Info("初始化餐厅"); 
  35.             //所有的工作人员都是一个线程 
  36.             全局线程 = ThreadPool.ThreadManager.GetInstance.GetThreadModel(new ThreadPool.ThreadModel("全局线程"1)); 
  37.             //所有的工作人员都是一个线程 
  38.             厨师s = ThreadPool.ThreadManager.GetInstance.GetThreadModel(new ThreadPool.ThreadModel("厨师"3)); 
  39.             //所有的工作人员都是一个线程 
  40.             传菜员s = ThreadPool.ThreadManager.GetInstance.GetThreadModel(new ThreadPool.ThreadModel("传菜员"5)); 
  41.             //所有的工作人员都是一个线程 
  42.             服务员s = ThreadPool.ThreadManager.GetInstance.GetThreadModel(new ThreadPool.ThreadModel("服务员"5)); 
  43.             //所有的工作人员都是一个线程 
  44.             配菜员s = ThreadPool.ThreadManager.GetInstance.GetThreadModel(new ThreadPool.ThreadModel("配菜员"3)); 
  45.             //所有的工作人员都是一个线程 
  46.             收银员s = ThreadPool.ThreadManager.GetInstance.GetThreadModel(new ThreadPool.ThreadModel("收银员"1)); 
  47.             //所有的工作人员都是一个线程 
  48.             洗菜员s = ThreadPool.ThreadManager.GetInstance.GetThreadModel(new ThreadPool.ThreadModel("洗菜员"2)); 
  49.  
  50.             table = new 客人[tableSize]; 
  51.             for (int i = 0; i < tableSize; i++) 
  52.             { 
  53.                 Logger.Info("初始化餐桌 " + (i + 1) + " 号桌"); 
  54.             } 
  55.  
  56.         } 
  57.     } 
 

每一个工作人员都是一个线程。模拟线程。

我们这里,餐厅配置:"厨师", 3 "传菜员", 5  "服务员", 5  "配菜员", 3  "收银员", 1  "洗菜员", 2

各个环节的人员都不相同,且每一步操作都不进相同。

接下来我们初始化客人,

  1. /** 
  2.  *  
  3.  * @author 失足程序员 
  4.  * @Blog http://www.cnblogs.com/ty408/ 
  5.  * @mail 492794628@qq.com 
  6.  * @phone 13882122019 
  7.  *  
  8.  */ 
  9. namespace Sz.Network.DiningRoom 
  10.     public class 客人 
  11.     { 
  12.  
  13.         public static EnumStatus Status入座 = new EnumStatus(1 << 00x000000); 
  14.         public static EnumStatus Status取消 = new EnumStatus(1 << 10x000000); 
  15.         public static EnumStatus Status点菜 = new EnumStatus(1 << 20x000000); 
  16.         public static EnumStatus Status就餐 = new EnumStatus(1 << 30x000000); 
  17.         public static EnumStatus Status结账中 = new EnumStatus(1 << 40x000000); 
  18.         public static EnumStatus Status等待就餐 = new EnumStatus(1 << 50x000000); 
  19.         public static EnumStatus Status等待结账 = new EnumStatus(1 << 60x000000); 
  20.  
  21.         /// <summary> 
  22.         /// 存储临时数据的 
  23.         /// </summary> 
  24.         public ObjectAttribute TempAttribute = new ObjectAttribute(); 
  25.         /// <summary> 
  26.         /// 客人当前的状态 
  27.         /// </summary> 
  28.         public EnumStatus Staus = new EnumStatus(00x000000); 
  29.  
  30.         public List<菜肴> 菜肴s = new List<菜肴>(); 
  31.  
  32.         public int TableID { get; set; } 
  33.  
  34.         /// <summary> 
  35.         /// 每一个客人的随机标识 
  36.         /// </summary> 
  37.         public string guidID { get; set; } 
  38.  
  39.         public 客人(int tableID) 
  40.         { 
  41.             guidID = Guid.NewGuid().ToString().Replace("-"""); 
  42.             this.TableID = tableID; 
  43.             Staus |= Status入座; 
  44.             Show(); 
  45.         } 
  46.  
  47.         public void 点菜() 
  48.         { 
  49.             ThreadPool.ThreadManager.GetInstance.AddTask(餐厅.GetInstance.服务员s, new Task点菜(this)); 
  50.             Task随机事件发生处理器 task = new Task随机事件发生处理器(this.TableID + " 号桌客人 上碗筷"); 
  51.             ThreadPool.ThreadManager.GetInstance.AddTask(餐厅.GetInstance.服务员s, task); 
  52.         } 
  53.  
  54.         public void Add点菜(菜肴 菜) 
  55.         { 
  56.             菜肴s.Add(菜); 
  57.             ThreadPool.ThreadManager.GetInstance.AddTask(餐厅.GetInstance.洗菜员s, new Task菜(this, 菜)); 
  58.         } 
  59.  
  60.         public void Show() 
  61.         { 
  62.             string 状态 = ""
  63.             if (Staus.HasFlag(Status入座)) 
  64.             { 
  65.                 状态 = "入座"
  66.             } 
  67.             else if (Staus.HasFlag(Status取消)) 
  68.             { 
  69.                 状态 = "取消"
  70.             } 
  71.             else if (Staus.HasFlag(Status点菜)) 
  72.             { 
  73.                 状态 = "点菜"
  74.             } 
  75.             else if (Staus.HasFlag(Status等待就餐)) 
  76.             { 
  77.                 状态 = "等待就餐"
  78.             } 
  79.             else if (Staus.HasFlag(Status就餐)) 
  80.             { 
  81.                 状态 = "就餐"
  82.             } 
  83.             else if (Staus.HasFlag(Status等待结账)) 
  84.             { 
  85.                 状态 = "等待结账"
  86.             } 
  87.             else if (Staus.HasFlag(Status结账中)) 
  88.             { 
  89.                 状态 = "结账中"
  90.             } 
  91.             Logger.Info(this.TableID + " 号桌子 客人 " + this.guidID + " 当前状态:" + 状态); 
  92.         } 
  93.  
  94.     } 
 

#p#

初始化菜肴

  1. /** 
  2.  *  
  3.  * @author 失足程序员 
  4.  * @Blog http://www.cnblogs.com/ty408/ 
  5.  * @mail 492794628@qq.com 
  6.  * @phone 13882122019 
  7.  *  
  8.  */ 
  9. namespace Sz.Network.DiningRoom 
  10.     public class 菜肴 
  11.     { 
  12.  
  13.         public static EnumStatus Status点菜 = new EnumStatus(1 << 00x000000); 
  14.         public static EnumStatus Status取消 = new EnumStatus(1 << 10x000000); 
  15.         public static EnumStatus Status洗菜 = new EnumStatus(1 << 20x000000); 
  16.         public static EnumStatus Status配菜 = new EnumStatus(1 << 30x000000); 
  17.         public static EnumStatus Status炒菜 = new EnumStatus(1 << 40x000000); 
  18.         public static EnumStatus Status传菜 = new EnumStatus(1 << 50x000000); 
  19.         public static EnumStatus Status就餐 = new EnumStatus(1 << 60x000000); 
  20.         public static EnumStatus Status结束就餐 = new EnumStatus(1 << 70x000000); 
  21.  
  22.  
  23.         public string Name { get; private set; } 
  24.  
  25.  
  26.         public EnumStatus Staus = new EnumStatus(00x000000); 
  27.         /// <summary> 
  28.         /// 存储临时数据的 
  29.         /// </summary> 
  30.         public ObjectAttribute TempAttribute = new ObjectAttribute(); 
  31.  
  32.         public 菜肴(string name) 
  33.         { 
  34.             this.Name = name; 
  35.             Staus |= Status点菜; 
  36.             Show(); 
  37.         } 
  38.  
  39.         public void Show() 
  40.         { 
  41.             string 状态 = ""
  42.             if (Staus.HasFlag(Status点菜)) 
  43.             { 
  44.                 状态 = "点菜"
  45.             } 
  46.             else if (Staus.HasFlag(Status取消)) 
  47.             { 
  48.                 状态 = "取消"
  49.             } 
  50.             else if (Staus.HasFlag(Status洗菜)) 
  51.             { 
  52.                 状态 = "洗菜"
  53.             } 
  54.             else if (Staus.HasFlag(Status配菜)) 
  55.             { 
  56.                 状态 = "配菜"
  57.             } 
  58.             else if (Staus.HasFlag(Status炒菜)) 
  59.             { 
  60.                 状态 = "炒菜"
  61.             } 
  62.             else if (Staus.HasFlag(Status传菜)) 
  63.             { 
  64.                 状态 = "传菜"
  65.             } 
  66.             else if (Staus.HasFlag(Status就餐)) 
  67.             { 
  68.                 状态 = "就餐"
  69.             } 
  70.             Logger.Info(this.Name + " 当前状态:" + 状态); 
  71.         } 
  72.  
  73.     } 

我们需要创建一个定时器任务,对餐桌和客人进行状态监测和随机事件发生器

  1. /** 
  2.  *  
  3.  * @author 失足程序员 
  4.  * @Blog http://www.cnblogs.com/ty408/ 
  5.  * @mail 492794628@qq.com 
  6.  * @phone 13882122019 
  7.  *  
  8.  */ 
  9. namespace Sz.Network.DiningRoom 
  10.     public class TimerTask : ThreadPool.TimerTask 
  11.     { 
  12.  
  13.         /// <summary> 
  14.         /// 间隔 5000 毫秒执行一次 
  15.         /// </summary> 
  16.         public TimerTask() 
  17.             : base(餐厅.GetInstance.全局线程, 2000
  18.         { 
  19.  
  20.         } 
  21.  
  22.         public override void Run() 
  23.         {            
  24.             IEnumerable<IScript餐桌检查器> checkScripts = LoadScriptPool.LoadScriptManager.GetInstance.GetInstances<IScript餐桌检查器>(); 
  25.             foreach (var item in checkScripts) 
  26.             { 
  27.                 item.Run(); 
  28.             } 
  29.         } 
  30.  
  31.     } 

由于我们餐桌检查器是一个不定数,所以需要放到脚本去。方便更新程序代码。

#p#

在脚本项目里面创建脚本文件

  1. /** 
  2.  *  
  3.  * @author 失足程序员 
  4.  * @Blog http://www.cnblogs.com/ty408/ 
  5.  * @mail 492794628@qq.com 
  6.  * @phone 13882122019 
  7.  *  
  8.  */ 
  9. namespace Sz.Network.DiningRoom.Scripts 
  10.     public class Script餐桌检查器 : IScript餐桌检查器 
  11.     { 
  12.  
  13.         Random random = new Random(DateTime.Now.Millisecond); 
  14.  
  15.         public Script餐桌检查器() 
  16.         { 
  17.  
  18.         } 
  19.  
  20.         public void Run() 
  21.         { 
  22.             Logger.Info("==================================Script餐桌检查器======================================="); 
  23.             for (int i = 0; i < 餐厅.GetInstance.table.Length; i++) 
  24.             { 
  25.                 if (餐厅.GetInstance.table[i] == null
  26.                 { 
  27.                     int randomValue = random.Next(10000); 
  28.                     if (randomValue < 5000
  29.                     { 
  30.                         客人 客 = new 客人(i + 1); 
  31.                         餐厅.GetInstance.table[i] = 客; 
  32.                     } 
  33.                 } 
  34.                 else 
  35.                 { 
  36.                     客人 客 = 餐厅.GetInstance.table[i]; 
  37.                     if (客.Staus.HasFlag(客人.Status入座)) 
  38.                     { 
  39.                         ///如果客人刚刚入座,执行点菜,移交给服务员 
  40.                         客.Staus |= 客人.Status点菜; 
  41.                         客.点菜(); 
  42.                     } 
  43.                     else if (客.Staus.HasFlag(客人.Status等待就餐)) 
  44.                     { 
  45.                         bool isFor = true
  46.                         foreach (var item in 客.菜肴s) 
  47.                         { 
  48.                             if (!item.Staus.HasFlag(菜肴.Status就餐)) 
  49.                             { 
  50.                                 isFor = false
  51.                                 break
  52.                             } 
  53.                         } 
  54.                         if (isFor) 
  55.                         { 
  56.                             客.Staus |= 客人.Status就餐; 
  57.                             //模拟客人吃饭需要30到50秒 
  58.                             客.TempAttribute["Status就餐"] = SzExtensions.CurrentTimeMillis() + (random.Next(36)) * 10 * 1000
  59.                         } 
  60.                         else 
  61.                         { 
  62.                             //模拟随机事件 
  63.                             int randomValue = random.Next(10000); 
  64.                             if (randomValue < 6000
  65.                             { 
  66.                                 Logger.Info("随机事件发生 " + (i + 1) + " 号桌客人 添加茶水"); 
  67.                                 Task随机事件发生处理器 task = new Task随机事件发生处理器((i + 1) + " 号桌客人 添加茶水"); 
  68.                                 ThreadPool.ThreadManager.GetInstance.AddTask(餐厅.GetInstance.服务员s, task); 
  69.                             } 
  70.                         } 
  71.                     } 
  72.                     else if (客.Staus.HasFlag(客人.Status就餐)) 
  73.                     { 
  74.  
  75.                         if (客.TempAttribute.GetlongValue("Status就餐") < SzExtensions.CurrentTimeMillis()) 
  76.                         { 
  77.                             客.Staus |= 客人.Status等待结账; 
  78.                         } 
  79.                         else 
  80.                         { 
  81.                             //模拟随机事件 
  82.                             string msg = ""
  83.                             int randomValue = random.Next(10000); 
  84.                             if (randomValue < 3000
  85.                             { 
  86.                                 msg = " 添加米饭"
  87.                             } 
  88.                             else if (randomValue < 6000
  89.                             { 
  90.                                 msg = " 添加茶水"
  91.                             } 
  92.  
  93.                             if (!string.IsNullOrWhiteSpace(msg)) 
  94.                             { 
  95.                                 Logger.Info("随机事件发生 " + (i + 1) + " 号桌客人 " + msg); 
  96.                                 Task随机事件发生处理器 task = new Task随机事件发生处理器((i + 1) + " 号桌客人 " + msg); 
  97.                                 ThreadPool.ThreadManager.GetInstance.AddTask(餐厅.GetInstance.服务员s, task); 
  98.                             } 
  99.                         } 
  100.                     } 
  101.                     else if (客.Staus.HasFlag(客人.Status等待结账)) 
  102.                     { 
  103.                         客.Staus |= 客人.Status结账中; 
  104.                     } 
  105.                     else if (客.Staus.HasFlag(客人.Status结账中)) 
  106.                     { 
  107.                         Logger.Info((i + 1) + " 号桌客人 结束就餐 送走客人"); 
  108.                         餐厅.GetInstance.table[i] = null
  109.                         return
  110.                     } 
  111.                     客.Show(); 
  112.                 } 
  113.             } 
  114.         } 
  115.     } 

点菜也同样为方便程序更新,代码放在脚本执行

  1. /** 
  2.  *  
  3.  * @author 失足程序员 
  4.  * @Blog http://www.cnblogs.com/ty408/ 
  5.  * @mail 492794628@qq.com 
  6.  * @phone 13882122019 
  7.  *  
  8.  */ 
  9. namespace Sz.Network.DiningRoom.Scripts 
  10.     public class Script点菜 : IScript点菜 
  11.     { 
  12.  
  13.         public Script点菜() 
  14.         { 
  15.  
  16.         } 
  17.  
  18.         public void Run(客人 客) 
  19.         { 
  20.             List<string> 菜肴_荤菜s = new List<string>() { "回锅肉""青椒肉丝""东坡肘子""糖醋排骨""鱼香肉丝" }; 
  21.             List<string> 菜肴_素菜s = new List<string>() { "空心菜""凤尾""素炒竹笋""白油丝瓜" }; 
  22.             List<string> 菜肴_汤s = new List<string>() { "番茄煎蛋汤""紫菜蛋花汤""酸菜粉丝汤""素菜汤""肉片汤" }; 
  23.             Random random = new Random(DateTime.Now.Millisecond); 
  24.             { 
  25.                 //int 数量 = random.Next(1, 菜肴_荤菜s.Count); 
  26.                 int 数量 = 1
  27.                 for (int i = 0; i < 数量; i++) 
  28.                 { 
  29.                     int index = random.Next(菜肴_荤菜s.Count); 
  30.                     string name = 菜肴_荤菜s[index]; 
  31.                     菜肴_荤菜s.RemoveAt(index); 
  32.                     菜肴 菜 = new 菜肴(name); 
  33.                     客.Add点菜(菜); 
  34.                 } 
  35.             } 
  36.             { 
  37.                 //int 数量 = random.Next(1, 菜肴_素菜s.Count); 
  38.                 int 数量 = 1
  39.                 for (int i = 0; i < 数量; i++) 
  40.                 { 
  41.                     int index = random.Next(菜肴_素菜s.Count); 
  42.                     string name = 菜肴_素菜s[index]; 
  43.                     菜肴_素菜s.RemoveAt(index); 
  44.                     菜肴 菜 = new 菜肴(name); 
  45.                     客.Add点菜(菜); 
  46.                 } 
  47.             } 
  48.             { 
  49.                 //int 数量 = random.Next(1, 菜肴_汤s.Count); 
  50.                 int 数量 = 1
  51.                 for (int i = 0; i < 数量; i++) 
  52.                 { 
  53.                     int index = random.Next(菜肴_汤s.Count); 
  54.                     string name = 菜肴_汤s[index]; 
  55.                     菜肴_汤s.RemoveAt(index); 
  56.                     菜肴 菜 = new 菜肴(name); 
  57.                     客.Add点菜(菜); 
  58.                 } 
  59.             } 
  60.             客.Staus |= 客人.Status等待就餐;             
  61.         } 
  62.     } 

#p#

接下来,就是菜的流程任务执行器

  1. /** 
  2.  *  
  3.  * @author 失足程序员 
  4.  * @Blog http://www.cnblogs.com/ty408/ 
  5.  * @mail 492794628@qq.com 
  6.  * @phone 13882122019 
  7.  *  
  8.  */ 
  9. namespace Sz.Network.DiningRoom 
  10.     public class Task菜 : ThreadPool.TaskModel 
  11.     { 
  12.         public 客人 客 { get; set; } 
  13.  
  14.         public 菜肴 _菜肴 { get; set; } 
  15.  
  16.         public Task菜(客人 客, 菜肴 _菜肴) 
  17.         { 
  18.             this.客 = 客; 
  19.             this._菜肴 = _菜肴; 
  20.         } 
  21.  
  22.         public override void Run() 
  23.         { 
  24.             Random random = new Random(DateTime.Now.Millisecond); 
  25.             string 事件 = ""
  26.             EnumStatus tempStatus = null
  27.             long threadID = 0
  28.  
  29.             if (_菜肴.Staus.HasFlag(菜肴.Status点菜)) 
  30.             { 
  31.                 事件 = "洗菜"
  32.                 tempStatus = 菜肴.Status洗菜; 
  33.                 threadID = 餐厅.GetInstance.洗菜员s; 
  34.             } 
  35.             else if (_菜肴.Staus.HasFlag(菜肴.Status取消)) 
  36.             { 
  37.                 事件 = "取消"
  38.                 tempStatus = 菜肴.Status取消; 
  39.  
  40.             } 
  41.             else if (_菜肴.Staus.HasFlag(菜肴.Status洗菜)) 
  42.             { 
  43.                 事件 = "配菜"
  44.                 tempStatus = 菜肴.Status配菜; 
  45.                 threadID = 餐厅.GetInstance.配菜员s; 
  46.             } 
  47.             else if (_菜肴.Staus.HasFlag(菜肴.Status配菜)) 
  48.             { 
  49.                 事件 = "炒菜"
  50.                 tempStatus = 菜肴.Status炒菜; 
  51.                 threadID = 餐厅.GetInstance.厨师s; 
  52.             } 
  53.             else if (_菜肴.Staus.HasFlag(菜肴.Status炒菜)) 
  54.             { 
  55.                 事件 = "传菜"
  56.                 tempStatus = 菜肴.Status传菜; 
  57.                 threadID = 餐厅.GetInstance.传菜员s; 
  58.             } 
  59.             else 
  60.             { 
  61.                 return
  62.             } 
  63.  
  64.             int timer = random.Next(20005000); 
  65.             ///模拟耗时 
  66.             Thread.Sleep(timer); 
  67.  
  68.             ///修改菜肴的状态 
  69.             this._菜肴.Staus |= tempStatus; 
  70.  
  71.             Logger.Info(Thread.CurrentThread.Name + "  " + 客.TableID + " 号桌 客人 " + this._菜肴.Name +" "+ 事件 + " 耗时:" + timer); 
  72.  
  73.             if (this._菜肴.Staus.HasFlag(菜肴.Status传菜)) 
  74.             { 
  75.                 ///修改菜肴的状态 
  76.                 this._菜肴.Staus |= 菜肴.Status就餐; 
  77.             } 
  78.  
  79.             if (threadID > 0
  80.             { 
  81.                 //移交到下一个工作人员(线程) 
  82.                 ThreadPool.ThreadManager.GetInstance.AddTask(threadID, this); 
  83.             } 
  84.  
  85.         } 
  86.  
  87.     } 

我们修改一下餐厅的 init 方法

  1. //加载脚本 
  2.             LoadScriptPool.LoadScriptManager.GetInstance.LoadCSharpFile(new string[] { @"..\..\..\Sz.Network.DiningRoom.Scripts\" }); 
  3.             //初始化定时器任务 
  4.             ThreadPool.ThreadManager.GetInstance.AddTimerTask(new TimerTask()); 

菜肴的流程,交给了 Task菜 类处理,菜肴的状态值修改也是要交给 Task菜 修改的,保证了在同一线程修改状态值就保证状态值的正常。

既然说了要有随机事件发生,那肯定少不了随机事件的处理器

  1. /** 
  2.  *  
  3.  * @author 失足程序员 
  4.  * @Blog http://www.cnblogs.com/ty408/ 
  5.  * @mail 492794628@qq.com 
  6.  * @phone 13882122019 
  7.  *  
  8.  */ 
  9. namespace Sz.Network.DiningRoom 
  10.     public class Task随机事件发生处理器 : ThreadPool.TaskModel 
  11.     { 
  12.  
  13.         string msg; 
  14.         public Task随机事件发生处理器(string msg) 
  15.         { 
  16.             this.msg = msg; 
  17.         } 
  18.  
  19.         public override void Run() 
  20.         { 
  21.             Random random = new Random(DateTime.Now.Millisecond); 
  22.             int timer = random.Next(20005000); 
  23.             //模拟随机事件耗时 
  24.             Thread.Sleep(timer); 
  25.             Logger.Info(Thread.CurrentThread.Name + " 处理随机事件发生 " + msg + " 耗时:" + timer); 
  26.         } 
  27.     } 

这样我们就能启动程序了测试一下了。

整个流程就是,客人入座,点菜,,被分配到到洗菜,配菜,炒菜,传菜。就餐。结账。等一系列流程。

由于人员配置不同,具体工作耗时不同,所以一切都发生都是不定项;

每一个操作在移交给下一个工作者(线程)都是不定操作。而每一个工作者(线程)都有先来后到的原则进行自己工作的处理;

我们未来方便测试和看清楚执行流程。我们只开启一个餐桌;

你程序会做饭嘛?我是这样做到的

我的程序真的能做饭哦~!

 不知道,这样讲,是否能帮你讲明白呢???

老规矩,全套源码奉献 svn 地址    http://code.taobao.org/svn/flynetwork_csharp/trunk/Flynetwork/BlogTest

跪求保留

  1. /** 
  2.  *  
  3.  * @author 失足程序员 
  4.  * @Blog http://www.cnblogs.com/ty408/ 
  5.  * @mail 492794628@qq.com 
  6.  * @phone 13882122019 
  7.  *  
  8.  */ 

 

责任编辑:王雪燕 来源: 博客园
相关推荐

2019-11-04 05:10:15

Wi-Fi网络网速

2015-09-06 08:51:10

2013-03-15 13:33:06

2016-08-22 13:22:11

混合云云计算

2019-05-28 16:25:34

MySQL删除操作数据库

2013-08-08 10:52:38

App平台化超级App开放平台

2009-03-13 11:34:56

2013-07-05 14:33:19

IoCDIP

2015-08-24 14:44:21

2019-04-11 15:00:11

区块链比特币加密货币

2010-03-24 16:49:26

Python安装

2015-03-17 09:41:57

2020-01-18 15:10:57

机器人人工智能系统

2018-04-09 13:03:28

华为云游戏

2019-01-10 10:02:32

机器学习数据人工智能

2015-05-08 10:52:39

2020-11-29 18:53:15

Google 麒麟应用

2014-06-12 09:20:31

大数据医疗

2017-11-27 11:14:42

DNS上网IP地址

2012-12-07 09:50:29

安全分析大数据
点赞
收藏

51CTO技术栈公众号