zoukankan      html  css  js  c++  java
  • ConcurrentLinkedQueue 模拟火车售票过程

    火车票类

    public class Ticket {
    
        private String NO;    // 车票编号
        private double price; // 票价
    
        public Ticket(String nO, double price) {
            super();
            NO = nO;
            this.price = price;
        }
    
        public String getNO() {
            return NO;
        }
    
        public void setNO(String nO) {
            NO = nO;
        }
    
        public double getPrice() {
            return price;
        }
    
        public void setPrice(double price) {
            this.price = price;
        }
    
    }

    示例

    public class TicketTest5 {
        
        private static Queue<Ticket> queue = new ConcurrentLinkedQueue<Ticket>();
    
        private static Map<String, String> log = new HashMap<>();    
        private static double totalMoney = 0;        // 总金额
        private static double initTotalMoney = 0;    // 初始化10000张票的总金额
        private static Object lock = new Object();
        
        /**
         * 初始化10000张火车票信息
         */
        static {
            
            for (int i=0; i<10000; i++) {
                double money = Math.ceil(Math.random() * 100);  // 随机金额
                initTotalMoney += money;               // 统计所有票的总金额
                Ticket ticket = new Ticket("NO_"+i, money);
                queue.add(ticket);
            }
            
        }
        
        /**
         * 模拟业务的付款操作
         */
        public static void pay(String no, double money) {
            try {
                Thread.sleep(10);
                synchronized (lock) {
                    totalMoney += money;
                    log.put(no, "出票日期:" + new Date());
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        
        public static void main(String[] args) {
            
            long start = System.currentTimeMillis();
            CountDownLatch latch = new CountDownLatch(1); // 用于最后打印信息
            // 启动100个窗口进行出票
            for (int i=0; i<100; i++) {
                Runnable run = new Runnable() {
                    
                    @Override
                    public void run() {
                        // 每一个窗口出票数量不限,直至将所有的票售完
                        while (true) {
                            Ticket ticket = queue.poll();
                            if (ticket==null) {
                                latch.countDown();    // 打开门闩
                                break;
                            } else {
                                // 模拟付款
                                pay(ticket.getNO(), ticket.getPrice());
                                System.out.println("正在出票" + ticket.getNO());
                            }
                        }
                    }
                };
                Thread thread = new Thread(run);
                thread.start();
            }
            // 暂停,直至所有的票都售完再执行下面操作
            try {
                latch.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            
            long end = System.currentTimeMillis();
            // 将结果延时打印出来
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("耗时 :" + (end - start));
            System.out.println("10000张票初始总金额:" + initTotalMoney);
            System.out.println("售出总金额:" + totalMoney);
            System.out.println("合计售出数量 :" + log.size());
        }
    }

    输出结果:

     

  • 相关阅读:
    升讯威微信营销系统开发实践:目录
    升讯威微信营销系统开发实践:订阅号和服务号深入分析( 完整开源于 Github)
    ASP.NET MVC (Razor)开发<<周报与绩效考核系统>>,并免费提供园友们使用~~~
    使用 SailingEase WinForm 框架构建复合式应用程序(插件式应用程序)
    vertica提取json字段值
    centos上配置redis从节点
    查看出网IP
    centos上tcp抓包
    修改centos服务器时区并同步最新时间
    解决centos下tomcat启动太慢 & JDBC连接oracle太慢的问题
  • 原文地址:https://www.cnblogs.com/caoxb/p/9690993.html
Copyright © 2011-2022 走看看