zoukankan      html  css  js  c++  java
  • C#队列Queue,利用队列处理订单

    一、什么是队列

    队列(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; }
        }
    View Code

    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("订单处理完成,等待中。。。");
                            }
                        }
                    }
                }
    
            }
        }
    View Code

    测试截图如下:

    转载于:https://www.cnblogs.com/MrBlackJ/p/8663098.html

  • 相关阅读:
    vue的环境的搭建
    rem
    web前端面试题总结
    vue遇到的一些问题
    栅格布局的理解
    利用node的http模块创建一个简单的http服务器
    node 常用的一些终端的命令的快捷键
    node 环境变量设置方法
    CentOS7.5搭建Hadoop2.7.6完全分布式集群
    UUID做主键,好还是不好?这是个问题
  • 原文地址:https://www.cnblogs.com/ztf20/p/12117989.html
Copyright © 2011-2022 走看看