Java多线程案例:模拟12306火车站售票系统

该系统一共涉及到3个类:

  1. 车票(Ticket)
  2. 12306系统(System12306)
  3. 售票窗口(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火车站售票系统相关推荐

  1. 运用多线程知识写一个火车站售票系统

    题目简介: 在现实世界中有一种数据模型,模拟生产者与消费者模型.如火车票售票系统,将票据的数量录入服务器我们称之为"生产"了若干车票.各地终端会共享这些车票信息去售票.直到车票售票 ...

  2. java多线程之线程安全----铁路售票系统的实现

    案例: 铁道部发布了一个售票任务,要求销售1000张票,要求有5个窗口来进行销售,请编写多线程程序来模拟这个效果 窗口001正在销售第1000张票 窗口001正在销售第999张票 窗口002正在销售第 ...

  3. Python学习笔记17:实操案例十四(模拟高铁售票系统,推算几天后的日期)

    Python学习笔记17:实操案例十四(模拟高铁售票系统,推算几天后的日期) 1.模拟高铁售票系统 使用漂亮的表格模块PrettyTable 这个模块需要预先安装,不然直接导入会报错: 安装办法: h ...

  4. windows多线程系列001 火车站售票系统模拟程序

    其实我对多线程这一块一直也不是很熟悉,现在正好在项目中需要用到对多线程的优化问题,因此我对多线程的相关知识点进行了学习和总结,在此和大家一起学习和交流.这个系列主要涉及到进程和线程的概念以及利用互斥对 ...

  5. 火车站售票系统课程设计

    火车站售票系统课程设计 一.课题内容和要求 设计目标:设计一个火车售票系统,用C语言实现.对该系统的要求如下: (1) 需求描述: 一.系统角色: 1.火车站售票员: 火车站售票员能够使用本系统完成基 ...

  6. c语言程序设计火车站售票系统,C语言程序--火车站售票系统程序

    火车站售票系统程序 火车站售票查询系统: #include #include #include #include int shoudsave=0 ; int count1=0,count2=0,mar ...

  7. java 多线程 卖票_编写一个Java 多线程程序,完成三个售票窗口同时出售20张票(如下图所示);...

    编写一个Java 多线程程序,完成三个售票窗口同时出售20张票(如下图所示); 程序分析:(1)票数要使用同一个静态值: (2)为保证不会出现卖出同一个票数,要java多线程同步锁. 设计思路: (1 ...

  8. 小玩意-模拟高铁售票系统

    # CY3761 | 2021-10-19 14:58# http://www.fhdq.net | 特殊符号 # 任务1:模拟高铁售票系统 # 一车厢座位 有13行,每行5列 | 初始值为有票 # ...

  9. Java Web之从零开始开发火车票售票系统( 一 )

    本章将实现用户后台管理的添加(已完成).查询(已完成).修改(已完成).删除(已完成)功能.(由于前期处于测试阶段,未对数据进行限制,后期将进行完善) 系统开发平台 任务陈述 创建数据库(trainb ...

最新文章

  1. Delphi 的字符及字符串[4] - 字符串、字符指针与字符数组
  2. input 禁用智能提示_如何在智能手机上禁用紧急警报
  3. 【牛客 - 283H】图论一顿套模板(思维转化,Dijkstra)
  4. 开发者应该了解的API技术清单!
  5. CIO应用商业智能技术系统的重构思考
  6. RECOLL检索软件测试工资,Recoll桌面全文搜索工具
  7. 2021-06-19表单,内嵌框架
  8. Visual Studio 2019设置透明背景图片
  9. python 修改文件名有特殊符号_Linux删除包含特殊符号文件名的文件
  10. Appium自动化测试基础 — uiautomatorviewer定位工具
  11. 微信读书增长策略:“无限卡会员业务”
  12. 厦门情侣必去浪漫的餐厅
  13. JeecgBoot腾讯云部署发布小结
  14. Lab: Password reset poisoning via middleware:通过中间件使密码重置中毒靶场复盘
  15. 中文语音合成开源模型总结
  16. js中常用到的一些解决问题方法(整理一些真正有效能够使用到项目中的方法)(等待不断更新积累)
  17. 精心推荐8款实用国产软件,非常强大
  18. 《企业应用架构模式》30天阅读计划
  19. maven明明本地仓库有依赖包,还会远程下载的问题
  20. 【面试题-算法思想】如何从包含大量URL的A,B文件中找到相同的URL?

热门文章

  1. 互联网时代传播法则,大家互相学习一下
  2. TMS570-1-GIO学习
  3. 二十几岁女孩应有的思想
  4. H.264/AVC视频编解码技术
  5. 【JVM】Java类加载器设计原理(ClassLoader源码解读/ SPI机制/ 绕开双亲委派/ 常见Java虚拟机)
  6. 深度优先算法和广度优先算法(python)
  7. 推荐一个多功能且实用的shopee大数据分析系统―—知虾数据
  8. 必做的高收益自媒体平台,分享给大家
  9. 涂鸦sc102云台机 经常离线
  10. C语言小游戏井字棋(三子棋)