队列(Queue)代表了一个先进先出的对象集合。当您需要对各项进行先进先出的访问时,则使用队列。当您在列表中添加一项,称为入队,当您从列表中移除一项时,称为出队。
案例介绍:目前有一个需求为当前上架商品数量有限,采取先到先得原则,当商品库存为0时,继续下单提示无库存,类似于抢单功能。
思路:开启一个线程去创建订单,同时处理订单线程开启,如队列里有订单,那么就处理,直到没有就一直处于等待状态(这里我等待20次就退出),等待订单加入队列再继续处理订单。
具体代码:首先我新建了一个订单结构类OrderInfo
public class OrderInfo
{
public int OrderId { get; set; }
public int ProductId { get; set; }
public Decimal Price { get; set; }
public string Remarks { get; set; }
}
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 = 999 + i;
order.Price = 999;
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("订单处理完成,等待中。。。");
}
}
}
}
}
案例仅供参考使用,如有改进地方,请路过大神多多指教。