• 这样做程序


    程序

    程序当然不能做饭。

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

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

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

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

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

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

    新建控制台项目:

    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 << 0, 0x000000); 
    14.         public static EnumStatus Status取消 = new EnumStatus(1 << 1, 0x000000); 
    15.         public static EnumStatus Status点菜 = new EnumStatus(1 << 2, 0x000000); 
    16.         public static EnumStatus Status就餐 = new EnumStatus(1 << 3, 0x000000); 
    17.         public static EnumStatus Status结账中 = new EnumStatus(1 << 4, 0x000000); 
    18.         public static EnumStatus Status等待就餐 = new EnumStatus(1 << 5, 0x000000); 
    19.         public static EnumStatus Status等待结账 = new EnumStatus(1 << 6, 0x000000); 
    20.  
    21.         /// <summary> 
    22.         /// 存储临时数据的 
    23.         /// </summary> 
    24.         public ObjectAttribute TempAttribute = new ObjectAttribute(); 
    25.         /// <summary> 
    26.         /// 客人当前的状态 
    27.         /// </summary> 
    28.         public EnumStatus Staus = new EnumStatus(0, 0x000000); 
    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.     } 
     

    初始化菜肴

    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 << 0, 0x000000); 
    14.         public static EnumStatus Status取消 = new EnumStatus(1 << 1, 0x000000); 
    15.         public static EnumStatus Status洗菜 = new EnumStatus(1 << 2, 0x000000); 
    16.         public static EnumStatus Status配菜 = new EnumStatus(1 << 3, 0x000000); 
    17.         public static EnumStatus Status炒菜 = new EnumStatus(1 << 4, 0x000000); 
    18.         public static EnumStatus Status传菜 = new EnumStatus(1 << 5, 0x000000); 
    19.         public static EnumStatus Status就餐 = new EnumStatus(1 << 6, 0x000000); 
    20.         public static EnumStatus Status结束就餐 = new EnumStatus(1 << 7, 0x000000); 
    21.  
    22.  
    23.         public string Name { get; private set; } 
    24.  
    25.  
    26.         public EnumStatus Staus = new EnumStatus(0, 0x000000); 
    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.     } 

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

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

    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(3, 6)) * 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.     } 

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

    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(2000, 5000); 
    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(2000, 5000); 
    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.  */ 
  • 相关阅读:
    map
    构造函数和对象
    for...in...and for each...in...
    事件
    JSON
    css伪类
    正则表达式
    什么是DOM、什么是BOM
    CSS颜色
    grid-layout实验
  • 原文地址:https://www.cnblogs.com/sandyliu1999/p/4956275.html
Copyright © 2020-2023  润新知