考虑到车道会有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