火车票类

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. [转载]java实现word转pdf

    最近遇到一个项目需要把word 转成pdf,百度了一下网上的方案有很多,比如虚拟打印.给word 装扩展插件等,这些方案都依赖于ms word 程序,在java代码中也得使用诸如jacob或jcom这 ...

  2. URAL 1557 Network Attack 图论,连通性,tarjain,dfs建树,分类讨论 难度:2

    http://acm.timus.ru/problem.aspx?space=1&num=1557 1557. Network Attack Time limit: 2.0 secondMem ...

  3. 重构Java代码的既有设计-影片出租店

    案例:计算每位顾客的消费金额并打印详细信息.顾客租赁了哪些影片,租期多长,根据租赁时间和影片类型计算出费用.影片分为3类:儿童片,新片,普通片.此外需计算该顾客的积分. Movie: public c ...

  4. node csrf 防御 待续

    csrf 防御 token 与 ajax 主要是在cookie添加随机数, 因为攻击者 无法访问第三方网站的 cookie,  加上httponly, 即使是xss也无法访问了 也可以在页面上嵌入一个 ...

  5. thinkphp3.1 多表联合查询代码

    php代码 public function info(){ $where['openid']=session('openid');////用户session $db = M("pay&quo ...

  6. Eclipse快捷键详细解析

    android开发中常用的Eclipse快捷键详细解析 1.查看快捷键定义的地方 Window->Preferences->General->Keys. 2.更改启动页 在Andro ...

  7. (转)使用Hive UDF和GeoIP库为Hive加入IP识别功能

    Hive是基于Hadoop的数据管理系统,作为分析人员的即时分析工具和ETL等工作的执行引擎,对于如今的大数据管理与分析.处理有着非常大的 意义.GeoIP是一套IP映射数据库,它定时更新,并且提供了 ...

  8. [Math]Pi(2)

    [Math]Pi(2) 接着前一篇,[Math]Pi(1),下面继续介绍Leonard Euler求Pi的第二个公式. 其实这个公式也是来源一个古老的问题,Basel problem . 证法1.麦克 ...

  9. ubuntu下erlang man的安装

    下载 http://www.erlang.org/download/otp_doc_man_17.1.tar.gz 找到erlang 安装目录 解压 otp_doc_man_17.1.tar.gz s ...

  10. 新的开源java反汇编程序Procyon

    wiki:https://bitbucket.org/mstrobel/procyon/wiki/Java%20Decompiler 由于jd好多年没更新了,今天找到这个新的开源反汇编,很不错 分享一 ...