Java多线程案例:模拟12306火车站售票系统
Java多线程案例:模拟12306火车站售票系统
该系统一共涉及到3个类:
- 车票(Ticket)
- 12306系统(System12306)
- 售票窗口(Window)
车票类,涉及三个属性:
- 起始站
- 终点站
- 票价
public class Ticket {//起始站private String startStation;//终点站private String destination;/**POJO对象,它里面的基本类型最好使用包装类* 因为如果如果该类用来装从数据库中读取的信息* 如果读取出null,那么基本类型是无法存null的,就会报错*///票价private Float price;public Ticket(){}public Ticket(String startStation, String destination, Float price) {this.startStation = startStation;this.destination = destination;this.price = price;}//为了让打印输出时方便,我们重写toString方法public String toString() {StringBuilder builder = new StringBuilder("[");builder.append(this.startStation);builder.append("--->");builder.append(this.destination);builder.append(":");builder.append(this.price);builder.append("]");return builder.toString();}//get() and set()....}
12306系统,有一个属性—>Vector集合,有一个方法—>获取一张车票getTicket()
- 利用Vector集合存储该系统所有的车票
- 利用Vector的线程安全特性,同一时间只能有一个线程操作该集合,保证安全
- 并且该系统应该是单例的
public class System12306 {//设计一个单例模式private System12306(){}private static volatile System12306 sys;public static System12306 getInstance(){if (sys == null){synchronized (System12306.class){if(sys == null)sys = new System12306();}}return sys;}//属性,用一个集合存票,我们使用线程安全的Vector,或者使用Stack,它继承了Vectorprivate Vector<Ticket> tickets = new Vector<>();private String[] starts = {"北京","天津","太原","运城","西安"};private String[] ends = {"上海","武汉","苏州","深圳","昆明","广州"};//当前系统创建后,就给tickets集合赋值{for(int i = 10;i<100;i++){//一共90张票int r1 = (int)(Math.random()*starts.length);int r2 = (int)(Math.random()*ends.length);float price = r1*r2*5+140;tickets.add(new Ticket(starts[r1],ends[r2],price));}}//设计一个方法,从集合中获取一张票public Ticket getTicket(){try {return tickets.remove(0);}catch (Exception e){return null;}}
}
售票窗口类,有一个属性—>窗口名称,有一个方法—>出售车票sellTicket()
- 同一时间有多个窗口同时售票,该类实现了Runnable接口,达到多线程并发的效果
public class Window implements Runnable {private String windowName;//窗口的名字public Window(String windowName){this.windowName = windowName;}@Overridepublic void run() {this.sellTicket();}public void sellTicket(){while (true){System12306 sys = System12306.getInstance();Ticket ticket = sys.getTicket();if(ticket==null){System.out.println("对不起,"+windowName+"窗口车票已售完...");break;}System.out.println("从"+windowName+"窗口售出:"+ticket);}}
}
测试代码:
public class TestMain {public static void main(String[] args) {Window win1 = new Window("北京西站");Window win2 = new Window("运城北站");Window win3 = new Window("太原南站");new Thread(win1).start();new Thread(win2).start();new Thread(win3).start();}
}
多线程并发执行的效果:
Java多线程案例:模拟12306火车站售票系统相关推荐
- 运用多线程知识写一个火车站售票系统
题目简介: 在现实世界中有一种数据模型,模拟生产者与消费者模型.如火车票售票系统,将票据的数量录入服务器我们称之为"生产"了若干车票.各地终端会共享这些车票信息去售票.直到车票售票 ...
- java多线程之线程安全----铁路售票系统的实现
案例: 铁道部发布了一个售票任务,要求销售1000张票,要求有5个窗口来进行销售,请编写多线程程序来模拟这个效果 窗口001正在销售第1000张票 窗口001正在销售第999张票 窗口002正在销售第 ...
- Python学习笔记17:实操案例十四(模拟高铁售票系统,推算几天后的日期)
Python学习笔记17:实操案例十四(模拟高铁售票系统,推算几天后的日期) 1.模拟高铁售票系统 使用漂亮的表格模块PrettyTable 这个模块需要预先安装,不然直接导入会报错: 安装办法: h ...
- windows多线程系列001 火车站售票系统模拟程序
其实我对多线程这一块一直也不是很熟悉,现在正好在项目中需要用到对多线程的优化问题,因此我对多线程的相关知识点进行了学习和总结,在此和大家一起学习和交流.这个系列主要涉及到进程和线程的概念以及利用互斥对 ...
- 火车站售票系统课程设计
火车站售票系统课程设计 一.课题内容和要求 设计目标:设计一个火车售票系统,用C语言实现.对该系统的要求如下: (1) 需求描述: 一.系统角色: 1.火车站售票员: 火车站售票员能够使用本系统完成基 ...
- c语言程序设计火车站售票系统,C语言程序--火车站售票系统程序
火车站售票系统程序 火车站售票查询系统: #include #include #include #include int shoudsave=0 ; int count1=0,count2=0,mar ...
- java 多线程 卖票_编写一个Java 多线程程序,完成三个售票窗口同时出售20张票(如下图所示);...
编写一个Java 多线程程序,完成三个售票窗口同时出售20张票(如下图所示); 程序分析:(1)票数要使用同一个静态值: (2)为保证不会出现卖出同一个票数,要java多线程同步锁. 设计思路: (1 ...
- 小玩意-模拟高铁售票系统
# CY3761 | 2021-10-19 14:58# http://www.fhdq.net | 特殊符号 # 任务1:模拟高铁售票系统 # 一车厢座位 有13行,每行5列 | 初始值为有票 # ...
- Java Web之从零开始开发火车票售票系统( 一 )
本章将实现用户后台管理的添加(已完成).查询(已完成).修改(已完成).删除(已完成)功能.(由于前期处于测试阶段,未对数据进行限制,后期将进行完善) 系统开发平台 任务陈述 创建数据库(trainb ...
最新文章
- Delphi 的字符及字符串[4] - 字符串、字符指针与字符数组
- input 禁用智能提示_如何在智能手机上禁用紧急警报
- 【牛客 - 283H】图论一顿套模板(思维转化,Dijkstra)
- 开发者应该了解的API技术清单!
- CIO应用商业智能技术系统的重构思考
- RECOLL检索软件测试工资,Recoll桌面全文搜索工具
- 2021-06-19表单,内嵌框架
- Visual Studio 2019设置透明背景图片
- python 修改文件名有特殊符号_Linux删除包含特殊符号文件名的文件
- Appium自动化测试基础 — uiautomatorviewer定位工具
- 微信读书增长策略:“无限卡会员业务”
- 厦门情侣必去浪漫的餐厅
- JeecgBoot腾讯云部署发布小结
- Lab: Password reset poisoning via middleware:通过中间件使密码重置中毒靶场复盘
- 中文语音合成开源模型总结
- js中常用到的一些解决问题方法(整理一些真正有效能够使用到项目中的方法)(等待不断更新积累)
- 精心推荐8款实用国产软件,非常强大
- 《企业应用架构模式》30天阅读计划
- maven明明本地仓库有依赖包,还会远程下载的问题
- 【面试题-算法思想】如何从包含大量URL的A,B文件中找到相同的URL?