一、什么是隊列
隊列(Queue)代表了一個先進先出的對象集合。當您需要對各項進行先進先出的訪問時,則使用隊列。當您在列表中添加一項,稱為入隊,當您從列表中移除一項時,稱為出隊。
二、利用隊列來處理訂單問題
思路:開啟一個線程去創建訂單,同時處理訂單線程開啟,如隊列里有訂單,那么就處理,直到沒有就一直處於等待狀態(這里我等待20次就退出),等待訂單加入隊列再繼續處理訂單。
1、新建一個訂單OrderInfo(用的是結構)
public struct OrderInfo
{
public int OrderId { get; set; }
public int ProductId { get; set; }
public Decimal Price { get; set; }
public string Remarks { get; set; }
}
2、到控制執行
class Program
{
public static readonly Queue<OrderInfo> queue = new Queue<OrderInfo>();
public static object obj = new object();
static void Main(string[] args)
{
#region 模仿淘寶處理訂單問題
//訂單進入隊列等待
Task OrderTask = new Task(CreateOrder);
OrderTask.Start();
//開啟線程處理訂單
Task taskDeal = new Task(DealOrder);
taskDeal.Start();
Console.WriteLine("hello");
#endregion
Console.ReadKey();
}
public static void CreateOrder()
{
for (int i = 1; i < 50; i++)
{
Thread.Sleep(300);
lock (obj)
{
OrderInfo order = new OrderInfo();
order.OrderId = i;
order.ProductId = 2800 + i;
order.Price = 888;
order.Remarks = "quick send goods";
queue.Enqueue(order);
Console.WriteLine("添加了一條訂單" + i);
}
}
}
public static int flag = 0;
public static void DealOrder()
{
while (true)
{
Thread.Sleep(500);
if (queue.Count > 0)
{
lock (obj)
{
if (queue.Count > 0)
{
OrderInfo order = queue.Dequeue();
Console.WriteLine("處理==>訂單號{0};商品:{1}價格:{2}", order.OrderId, order.ProductId, order.Price);
}
}
}
else
{
Thread.Sleep(2000);
flag++;
if (flag > 10) { Console.WriteLine("All Over"); break; }
lock (obj)
{
if (queue.Count <= 0)
{
Console.WriteLine("訂單處理完成,等待中。。。");
}
}
}
}
}
}
測試截圖如下:
轉載於:https://www.cnblogs.com/MrBlackJ/p/8663098.html
