火车票类

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());
}
}

输出结果:

ConcurrentLinkedQueue 模拟火车售票过程的更多相关文章

  1. Java多线程 编写三各类Ticket、SaleWindow、TicketSaleCenter分别代表票信息、售票窗口、售票中心。 售票中心分配一定数量的票,由若干个售票窗口进行出售,利用你所学的线程知识来模拟此售票过程。

    package com.swift; import java.util.ArrayList; import java.util.HashMap; import java.util.List; impo ...

  2. 项目实战:Qt+C#轨道交通行业高性能高流畅度模拟火车移动图像控件

    需求   高清线阵相机扫描火车并自动切割单节车厢完成图像合成.通过视频图像处理组件流畅模拟火车行驶整个过程的视频图像:  1.模拟火车通过时的滚动图像,图像主要以两侧和顶部图像的预览为主;  2.模拟 ...

  3. Telnet 模拟邮件发送过程

    Telnet 模拟邮件发送过程 windows要提前开启Telnet客户端的功能,再按照下面步骤完成邮件发送: 1.通过 cmd 进入命令窗口 2.连接要发送邮件的服务器:telnet smtp.al ...

  4. 编写Java程序,用户在网上购买商品(good),当用户买了一本书(book)、一顶帽子(hat)或者买了一双鞋子(shoe),卖家就会通过物流将商品邮寄给用户,使用简单工厂模式模拟这一过程。

    查看本章节 查看作业目录 需求说明: 编写Java程序,用户在网上购买商品(good),当用户买了一本书(book).一顶帽子(hat)或者买了一双鞋子(shoe),卖家就会通过物流将商品邮寄给用户, ...

  5. 编写Java程序,前方有 3km 的道路障碍,4 辆普通车不能通过,必须等到清障车完成作业离开后,才能继续行驶。用程序来模拟这一过程的发生

    查看本章节 查看作业目录 需求说明: 前方有 3km 的道路障碍,4 辆普通车不能通过,必须等到清障车完成作业离开后,才能继续行驶.用程序来模拟这一过程的发生 实现思路: 创建清障车Wrecker类和 ...

  6. 编写Java程序,模拟五子棋博弈过程中的异常声明和异常抛出

    返回本章节 返回作业目录 需求说明: 模拟五子棋博弈过程中的异常声明和异常抛出,判断用户所下棋子的位置,是否超越了棋盘的边界. 棋盘的横坐标的范围为0-9,纵坐标范围为0-14,如果用户所放棋子的坐标 ...

  7. Mysql模拟故障恢复案例过程

    一.数据库全备,全备脚本如下: [root@leader script]# cat bak_all.sh #!/bin/bash#Date: 2019-12-08#Author: chan#Mail: ...

  8. python模拟websocket握手过程中计算sec-websocket-accept

    背景 以前,很多网站使用轮询实现推送技术.轮询是在特定的的时间间隔(比如1秒),由浏览器对服务器发出HTTP request,然后由服务器返回最新的数据给浏览器.轮询的缺点很明显,浏览器需要不断的向服 ...

  9. Oracle11gr2_ADG管理之在备库上模拟failover的过程实战

    技术建议和方案. 要求failover后不重建备库,并能够把failover的数据库重新切换回备库 主库为newtest,备库为snewtest 备库上已经开启了闪回 得到一个参考的SCN SQL&g ...

随机推荐

  1. yum的搭建

    搭建本地yum仓库的步骤 . 创建光盘目录,挂载光盘 . 进入/etc/yum/repos.d目录下,备份所有配置文件 . 利用一个含有大写M的配置文件作为配置文件的模板 . 在模板里将enabled ...

  2. hdu2426

    题解: KM模板题 如果n>m,输出-1 如果a[match[i]][i]==-1输出-1 负的边不用考虑 初始都赋值为-1 代码: #include<cstdio> #includ ...

  3. SCM-MANAGER

    什么是SCM-MANAGER 基于Web的,集成了  Git. Mercurial .Subversion  多种代码管理工具的源代码管理平台 它有什么优点 简易安装 不需要破解配置文件,完全可配置的 ...

  4. C++面向对象高级编程(一)基础篇

    技术在于交流.沟通,转载请注明出处并保持作品的完整性. 概要: 知识点1 构造函数与析构函数 知识点2 参数与返回值 知识点3 const 知识点4 函数重载(要与重写区分开) 知识点5 友元 先以C ...

  5. React 与 可视化

    一般会想到 canvas 和 svg ; svg更适合画图, 但由于cavans在移动端的良好兼容性, 使用的更广; 什么是svg, scalable vector graphics  全称 可缩放矢 ...

  6. c# 获取随机数字/字符/时间

    using System; using System.Text; namespace HuaTong.General.Utility { /// <summary> /// 随机字符/数字 ...

  7. NorFlash、NandFlash、eMMC比较区别

    快闪存储器(英语:Flash Memory),是一种电子式可清除程序化只读存储器的形式,允许在操作中被多次擦或写的存储器.这种科技主要用于一般性数据存储,以及在电脑与其他数字产品间交换传输数据,如储存 ...

  8. [置顶] Retrofit2 初印象?

    鄙人由于工作繁忙很久没写博客了还望大家谅解!之前csdn登不上,算了不说借口了,retrofit2相信已经很火了吧,而且上手也比较容易,之前可能大家都是用Volley,Okhttp.Okhttp3其实 ...

  9. mdev USB disk auto mount demo

    /********************************************************************* * mdev USB disk auto mount de ...

  10. learn go function callback

    package main // 参考文档: // https://github.com/Unknwon/the-way-to-go_ZH_CN/blob/master/eBook/06.7.md im ...