使用线程安全字典与队列模拟红绿灯通行 (2)

考虑到车道会有4车道,人行道也不是排队过马路,所以在车辆与人模型里加入了MaxParallel最大并行度。
车流量或者人流量先全部放到队列里,按照最大并行度去通行

/// <summary> /// 车 入队 /// </summary> static void CarInQueue<T>(T inQueueItem) where T : Car { carsQueue.Enqueue(inQueueItem); //Console.WriteLine("人流 进入等待队列"); } /// <summary> /// 人 入队 /// </summary> static void PersonInQueue<T>(T inQueueItem) where T : Person { personsQueue.Enqueue(inQueueItem); //Console.WriteLine("车流 进入等待队列"); } 初始化车行与人行

车行与人行便是此题的核心逻辑,由于我们已经初始化好了红绿灯的运行,车流人流的队列,其实实现起来就很简单了,主要分已下几步:
1:看红绿灯,是否可以通行,通行时间还有多久——》读取红绿灯的线程安全字典
2:绿灯时,等待队列中是否有车(人),按照每次最大并行量通行——》等待队列持续出队

static async void CarStart() { while (true) { TrafficLightDictionary.TryGetValue(_traffic, out int carRunTime); TrafficLightDictionary.TryGetValue(!_traffic, out int personRunTime); //Console.WriteLine($"车辆读取value:{CarTime}"); if (carRunTime > 0) { List<Car> carList = new List<Car>(); bool run = true; while (run) { if (carsQueue.Count > 0) { carsQueue.TryDequeue(out Car car); carList.Add(car); if (carList.Count == car.MaxParallel) { foreach (var item in carList) { Console.ForegroundColor = ConsoleColor.Green; Console.Write($"--车行--Id:{ item.Id}, Name:{ item.Name}--\t"); } Console.WriteLine("通行完毕"); run = false; } else { TrafficLightDictionary.TryGetValue(_traffic, out int newCarRunTime); if (newCarRunTime <= 0 ) { break; } if (carList.Count>0) { foreach (var item in carList) { Console.ForegroundColor = ConsoleColor.Green; Console.Write($"--车行--Id:{ item.Id}, Name:{ item.Name}--\t"); } } } } } } await Task.Delay(500); } }

篇幅考虑,就没有把人通行代码加入文章中,代码逻辑与车行一致,后续会把源码贴上。
至此已经把车、人行的逻辑都加上了,现在就是用一个新的线程将他们的程序跑起来。

static void Main(string[] args) { TrafficLightDictionary.AddOrUpdate(_traffic, _carRunTime, (_traffic, _greenLightTime) => _greenLightTime); TrafficLightDictionary.AddOrUpdate(!_traffic, _personRunTime, (_traffic, _redLightTime) => _redLightTime); Console.ForegroundColor = ConsoleColor.Blue; Console.WriteLine("红绿灯初始化运行!"); Timer TrafficLightTimer = new Timer(TrafficLightRun); TrafficLightTimer.Change(0, 1000); Task.Factory.StartNew(InitCarMode); Console.ForegroundColor = ConsoleColor.Blue; Console.WriteLine("初始化车流 模型 -完成"); Task.Factory.StartNew(createPersonMode); Console.ForegroundColor = ConsoleColor.Blue; Console.WriteLine("初始化人流 模型 -完成"); Thread.Sleep(1000); Task.Factory.StartNew(CarStart); Console.ForegroundColor = ConsoleColor.Blue; Console.WriteLine("初始化车辆通行 -完成"); Task.Factory.StartNew(PersonStart); Console.ForegroundColor = ConsoleColor.Blue; Console.WriteLine("初始化行人通行 -完成"); Console.ReadLine(); }

好的,编码工作完成,启动程序看效果↓

使用线程安全字典与队列模拟红绿灯通行

达到预期效果

源码地址:https://gitee.com/yi_zihao/TransportationTest

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwwxsp.html