一.思路

首先需要一个火车票实体Ticket,用来充当火车票角色;

其次需要一个单例的售票系统TicketSystem,用来售卖火车票;

最后需要具体的售票处Window,用来买票;

二.实现

1.火车票实体Ticket

class Ticket {// 起始站private String start;// 终点站private String end;// 票价,用BigDecimal防止后续需要计算,能保证精度private BigDecimal price;public Ticket() {}public Ticket(String start, String end, BigDecimal price) {this.start = start;this.end = end;this.price = price;}public String getStart() {return start;}public String getEnd() {return end;}public BigDecimal getPrice() {return price;}public void setStart(String start) {this.start = start;}public void setEnd(String end) {this.end = end;}public void setPrice(BigDecimal price) {this.price = price;}@Overridepublic String toString() {return "Ticket{" +"start='" + start + '\'' +", end='" + end + '\'' +", price=" + price +'}';}
}

2.单例线程安全的售票系统

// 单例系统,双重校验锁
class TicketSystem {private volatile static TicketSystem system = new TicketSystem();// 存储所有车票,其中CopyOnWriteArrayList保证线程安全读写private CopyOnWriteArrayList<Ticket> list = new CopyOnWriteArrayList<>();// 给车票赋值,类加载前就给list车票集合赋值{for (int i = 0; i < 100; i++) {list.add(new Ticket("北京" + i, "深圳" + i, new BigDecimal(i * 200 + 100)));}}private TicketSystem() {}// 双重锁校验生成系统对象public static TicketSystem getSystem() {if (system == null) {synchronized (TicketSystem.class) {if (system == null) {system = new TicketSystem();}}}return system;}// 买票方法public Ticket sellTicket() {try {return list.remove(0);} catch (IndexOutOfBoundsException e) {// 发生异常说明票卖完了return null;}}
}

3.售票窗口WIndow

// 当前窗口
class Window extends Thread {//当前窗口名称private String winName;public Window(String winName) {this.winName = winName;}public String getWinName() {return winName;}public void setWinName(String winName) {this.winName = winName;}@Overridepublic void run() {this.sellTicket();}// 买票系统public void sellTicket() {TicketSystem system = TicketSystem.getSystem();while (true) {Ticket ticket = system.sellTicket();if (ticket != null) {System.out.println("从" + this.winName + "售出一张票" + ticket);} else {System.out.println(this.winName + "票卖光了");break;}}}
}

测试类:

class Test {public static void main(String[] args) {for (int i = 0; i < 3; i++) {Window window = new Window("北京" + i + "站");window.start();}}
}

总结:运用了双重校验锁的单例模式写售票系统,实现了类的复用,不会被频繁的创建和销毁,节省了时间和空间资源。通过CopyOnWriteArrayList实现线程安全的集合。

拓展:TicketSystem中的票的起始站,票的数量能否自定义呢,更灵活,符合实际场景?

Java实现火车票售票系统相关推荐

  1. java火车票订票系统 论文_毕业设计(论文)-基于JAVA的火车票售票系统.doc

    毕业设计(论文)-基于JAVA的火车票售票系统.doc 还剩 45页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧,价低环保! 内容要点 ...

  2. java火车票售票系统_基于java的火车票售票系统,界面Swing

    [实例简介] 本系统是一个基于java的火车票管理系统,用Swing显示信息. 开发环境Eclipes,mysql数据库 用户分为 用户和管理员. Main.java 为程序入口 [实例截图] [核心 ...

  3. java火车票售票系统,火车购票系统,系统实现了用户会员管理、火车车次管理、火车座位管理、系统公告管理、火车票退票、火车票换乘、换乘查询、直达查询、乘车人管理、订单管理、个人中心管理等

    火车票售票系统 java火车票售票系统,系统实现了用户会员管理.火车车次管理.火车座位管理.系统公告管理.火车票退票.火车票换乘.换乘查询.直达查询.乘车人管理.订单管理.个人中心管理等. 数据库采用 ...

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

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

  5. 数据库课程设计——MySQL火车票售票系统

    数据库课程设计--火车票售票系统 很烦数据库课程设计?阅读本篇文章会让你不那么烦躁~ 话不多说先放源代码: https://github.com/shadowings-zy/TrainTicketsS ...

  6. 基于python的火车票订票系统的设计与实现_火车票售票系统的设计与实现毕业论文.doc...

    郑州轻工业学院 本科毕业设计(论文) 题 目: 火车票售票系统的设计与实现 . 学生姓名: . 院 (系): 计算机与通信工程学院 . 专业班级: 网络工程(物联网技术13-01) . 学 号: . ...

  7. 基于JAVA网上汽车售票系统计算机毕业设计源码+数据库+lw文档+系统+部署

    基于JAVA网上汽车售票系统计算机毕业设计源码+数据库+lw文档+系统+部署 基于JAVA网上汽车售票系统计算机毕业设计源码+数据库+lw文档+系统+部署 本源码技术栈: 项目架构:B/S架构 开发语 ...

  8. 基于python的火车票售票系统/基于django火车票务网站/火车购票系统

    摘  要 随着科学技术的飞速发展,社会的方方面面.各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,火车票售票系统当然也不能排除在外.火车票售票系统是以实际运用为开发背景,运用软件工 ...

  9. 数据库课程设计——火车票售票系统

    摘要 数据库课程设计的题目,设计了一个火车票售票系统,实现了列车信息查询,车票查询及购买,订单查询,个人信息管理等功能,数据是从12306爬取的真实数据. 项目链接 前端项目链接:https://gi ...

最新文章

  1. Github for Windows使用图文教程
  2. HIN2Vec:异质信息网络中的表示学习 | PaperDaily #18
  3. php模拟表单提交登录,PHP模拟表单的post请求实现登录
  4. 还服务器网站被k,导致网站被K的主要原因,看看你有没有中招!
  5. 计算机算法可分为两大类别_广东元耀:您了解过防水淋雨试验箱可分为哪几种类别吗?...
  6. 前端—每天5道面试题(十三)
  7. 下载 针式PKM V9.08 版
  8. windows核心编程之DIPS工具学习总结
  9. 系统设计-HIPO图
  10. idea使用教程-安装
  11. 寻找“最好”(2)——欧拉-拉格朗日方程
  12. matlab绘制蜗牛圈圈图,Matlab实现的图像中的圆、矩形、正方形等形状识别
  13. 移动新魔百和M302A-YS代工_卡刷固件包
  14. android跳转到锁屏及后台管理界面,Android 锁屏状态下后台弹出界面
  15. python 全栈开发,Day88(csrf_exempt,ES6 快速入门,Vue)
  16. excel中vlookup函数的使用方法_Excel教程:函数VLOOKUP实用技巧
  17. Solidworks部分报错及解决方法
  18. latex tips 偏导数符号 单词partial+倒三角 \nabla
  19. GDPR: Impact to Your Data Management Landscape: Part 2
  20. 第九章-项目人力资源管理

热门文章

  1. C 小树快长高 SDUT
  2. “字节一年,人间三年!”
  3. 拯救移动硬盘实录 - 参数不正确 卡系统
  4. 03-STM32+BC26丨260Y远程升级篇(自建物联网平台)-功能测试-STM32+BC26丨260Y实现利用http远程更新STM32程序(单片机程序检查更新)
  5. 新冠肺炎疫情引发空前应用需求,Dynatrace助企业轻松应对
  6. Android硬件加速原理与实现
  7. 【安卓】rxjava2的disposable
  8. RxJava(八)Disposable和Transformer
  9. 17个不得不知的WIN7快捷键
  10. Fixed There was a problem with the editor 'vi'