java多线程模拟购买火车票

java多线程模拟购买火车票

  1. 本次做的是一个火车票的售卖模拟,不管用户是在窗口还是APP上购买,必然不可能买到同一张票这也就是说一张票的售卖必然是一个线程在操作的,所以,我们在写代码是也要注意这一点

  2. 首先我们要进行分析 我们需要几个类来完成我们的代码 根据java面向对象编程的思想,我们可以代入现实生活中的场景
    买票–>车站–>窗口–>购票
    通过上述的流程我们可以大概的先分为三个类 车票类 车站类(或者系统类,统一储存票的地方)
    而其中,我们知道火车站或者APP上,每个用户在任何时间都能够购票,所以买票是可以很多人一起进行的,而窗口也是如此,同样的时间,有可能5个窗口都在售票,但是窗口出票是单线程的,而售票功能则是多线程在进行的,所以我们将窗口类设置为多线程的实现类

  3. 类的分析完毕,开始编写代码

  • 车票类-->起始站-->终点站-->价格  这是车票固有的属性
    
  • 系统类-->统一储存的车票(可以用集合来储存)-->出票方法(从集合中减少一张票,售出)
    
  • 窗口类-->继承Thread并重写run()方法-->售票方法(调用系统中的出票方法)
    

车票类

package Thread.train_tickets;public class Ticket {private String start;private String end;private Float price;public Ticket(){}public Ticket(String start, String end, Float price){this.start = start;this.end = end;this.price = price;}public String getStart() {return start;}public void setStart(String start) {this.start = start;}public String getEnd() {return end;}public void setEnd(String end) {this.end = end;}public Float getPrice() {return price;}public void setPrice(Float price) {this.price = price;}@Overridepublic String toString() {return "Ticket{" +"start='" + start + '\'' +", end='" + end + '\'' +", price=" + price +'}';}
}

系统类

package Thread.train_tickets;import java.util.List;
import java.util.Vector;public class System12306 {//单例模式  事先创建对象private static System12306 sys = new System12306();private List<Ticket> vector = new Vector<Ticket>();//在类加载的时候向集合中添加元素{for(int i=0;i<50;i++){vector.add(new Ticket("北京"+i,"深圳"+i,i*25/10F));}}private System12306(){}public static System12306 getSystem12306(){return sys;}//出票方法public Ticket sellTicket(){try{return vector.remove(0);//直接从集合中删除第一个元素}catch(IndexOutOfBoundsException e){return null;//如果出现了异常,证明集合已经没有元素,直接返回null即可}}
}

窗口类

package Thread.train_tickets;public class Window extends Thread{private String windowName;public Window(String windowName) {this.windowName = windowName;}public String getWindowName() {return windowName;}public void setWindowName(String windowName) {this.windowName = windowName;}public void run(){this.sellTicket();}//系统售票方法public void sellTicket(){System12306 sys = System12306.getSystem12306();while(true){Ticket t = sys.sellTicket();//从集合中出一张票if(t!=null){//非空则出票成功System.out.println("从"+this.windowName+"售出一张"+t);}else{System.out.println("票已售光");break;}}}
}

最后测试执行

package Thread.train_tickets;public class Test {public static void main(String[] args) {Window win1 = new Window("北京东站");Window win2 = new Window("北京西站");Window win3 = new Window("北京南站");// 注意不要调用run()方法win1.start();win2.start();win3.start();}
}

运行结果
每一次运行的结果都不相同
因为出票必须是保证线程安全的,同一时间只能有一张票被操作,所以集合上我们选择自带线程安全的Vector集合,同时在系统类加载时我们就需要集合中有数据,所以我们可以用代码块(在类加载的时候就执行)来进行集合中的数据添加,同时我们要保证每个窗口出的票是基于同一个系统对象,所以我们需要用单例模式来进行设计系统类

由于我是一名学生,所以写的代码难免会有很多不足之处,也希望各位能够多多指出来,非常感谢

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1621669.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Java使用多线程和GUI实现购买火车票<集合>

文章目录 绪&#xff1a;样例DEMO——购票项目项目要求实现步骤一、【车次.txt】【Person类】【Ticket类】1.【车次.txt】2.【Person类】3.【Ticket类】 二、主窗口 【Window类】1、界面2、事件监听1.窗口加载就显示出信息2.查找按钮3. 刷新4.购买 三、购买窗口【PayWindow类】…

Python selenium实现全自动购买火车票

这个是实现结果&#xff0c;因为一天只能取消三次&#xff0c;所以最后一步点击确认被我注释了 1.首先实现使用selenium登陆12306 关于使用selenium实现12306登陆可以看我的另一篇文章 这里实现了使用selenium登陆12306&#xff0c;这次是基于上次的代码进行修改实现全自动购买…

【web测试】实战1:去哪儿网购买火车票|优化|po模式

【web测试】实战1&#xff1a;去哪儿网购买火车票|优化|po模式 测试用例设计1.项目计划2.测试用例 项目实战脚本基本代码优化代码重构base_function.pyqunaer_book.pytest_qunaer_book.pydata.xlsx po模式目录base.pyfunction.pybook_ticket_page.pybook_list_page.pybook_orde…

java购买火车票

题目要求&#xff1a;假设从A地到B地的火车票有硬座和硬卧&#xff0c;价格分别为100和190元。根据铁路部门规定&#xff0c;未成年人&#xff08;18周岁以下&#xff09;身高不足120cm免票&#xff0c;120&#xff08;含&#xff09;-150&#xff08;不含&#xff09;cm需半票…

Java购买火车票(初识并发)

初识并发&#xff08;购买火车票&#xff09; 购买火车票 发现问题&#xff1a;多个线程操作同一个资源的情况下&#xff0c;线程不安全&#xff0c;数据紊乱。 Code: public class TicketDemo_04 implements Runnable{private int ticketNumber 10; // 票数Overridepubli…

Spring注解之@validated的使用

使用步骤 1.引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> 2.异常拦截类 /*** 全局异常处理*/ Slf…

电视卡众说纷纭(二):2007年度市面常见电视卡软硬件性能

在查找VISTA MCE插件开发的过程中看到很多的是跟电视卡硬件相关的资料。看到最多的名词就是软压卡、硬压卡。一个好的软件开发人员不只是要了解软件的开发&#xff0c;对硬件的设施也应该有相关的了解。要不然就成了闭塞的书呆子。所以我整理了我看到的关于电视卡比较好帖子和文…

dasBlog-1.8.5223.1中文版

dasBlog-1.8.5223.1中文版 本版本的DasBlog是qihangnet基于dasBlog-1.8.5223.1原版做的本地化版本。安装提示&#xff1a;1、由于本系统是使用Asp.Net开发的&#xff0c;所以在安装前请确保您的服务器或者虚拟主机支持Asp.net&#xff1b;2、请确定您将要安装的目录&#xff0c…

关于Linux下ISE和vivado安装cable usb驱动的问题

由于先前安装Android Studio一直不成功&#xff0c;一气之下&#xff0c;本人重装了系统&#xff0c;导致之前装的驱动什么的都没有了&#xff0c;这时再安装vivado&#xff0c;检测不到驱动&#xff0c;这里介绍怎么安装cable usb的驱动&#xff0c;供参考。 要安装这个驱动&a…

如何用计算机观看电视节目,如何将计算机显示器变成电视以观看节目

2006-11-16 如何在计算机上观看电视&#xff1f;我喜欢NBA&#xff0c;我喜欢 对于初次接触电视卡的用户&#xff0c;安装和接收电视确实不是一件容易的事。为此&#xff0c;我们将以Winfast TV2000电视卡为例来说明此应用程序的具体步骤。实际上&#xff0c;不同品牌的电视卡使…

ElasticSearch(一)数据类型

ElasticSearch&#xff08;一&#xff09;数据类型 1.简述 Es数据类型分为基础数据类型和复杂类型数据&#xff0c;掌握ES数据类型才能进一步使用ES检索数据内容。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot…

无人驾驶领域的软件测试该如何开展?

无人驾驶汽车使用自主决策和控制系统&#xff0c;这种系统通常由多个软件和硬件组件组成。软件测试是必要的&#xff0c;因为它可以确保无人驾驶汽车的软件系统达到高度可靠性和安全性&#xff0c;以及提高无人驾驶汽车的性能和可靠性。 因此无人驾驶汽车是一定要进行严格的软件…

手写数字识别之网络结构

目录 手写数字识别之网络结构 数据处理 经典的全连接神经网络 卷积神经网络 手写数字识别之网络结构 无论是牛顿第二定律任务&#xff0c;还是房价预测任务&#xff0c;输入特征和输出预测值之间的关系均可以使用“直线”刻画&#xff08;使用线性方程来表达&#xff09…

[牛客复盘] 牛客周赛 Round 9 20230827

[牛客复盘] 牛客周赛 Round 9 20230827 总结小美的外卖订单编号1. 题目描述2. 思路分析3. 代码实现 小美的加法1. 题目描述2. 思路分析3. 代码实现 小美的01串翻转1. 题目描述2. 思路分析3. 代码实现 小美的数组操作1. 题目描述2. 思路分析3. 代码实现 六、参考链接 总结 又是…

数据分析基础-数据可视化学习笔记03-可视化的符号与表示-图形符号学

概念 图型符号学&#xff08;Cartographic Symbolization&#xff09;是地图学领域中的一个重要概念&#xff0c;涉及到如何使用不同的符号、颜色、图案和标记来在地图上表示地理信息和数据。图型符号学旨在传达地理信息&#xff0c;使得地图能够清晰、有效地传达各种空间数据…

DDT数据驱动测试

简单介绍 ​ DDT&#xff08;Date Driver Test&#xff09;&#xff0c;所谓数据驱动测试&#xff0c;简单来说就是由数据的改变从而驱动自动化测试的执行&#xff0c;最终引起测试结果的改变。通过使用数据驱动测试的方法&#xff0c;可以在需要验证多组数据测试场景中&#…

【80天学习完《深入理解计算机系统》】第十一天 3.5 过程(函数调用)

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

模板(二)

目录 非类型模板参数 引入 分类 使用typename的特殊情况 注意点 模板特化 引入 介绍 函数模板特化 使用 ​编辑 优点 类模板特化 全特化 偏特化 部分特化 特殊的特化 使用 分离编译 介绍 问题代码示例 代码 说明 预处理 编译 链接 类模板实例化…

期货量化软件:衡量指标信息

机器学习依靠数据训练来学习市场的一般行为&#xff0c;最终做出相当准确的预测。 所选学习算法必须遍历精心挑选的样本&#xff0c;以便提取有意义的信息。 许多人未能成功应用这些精密工具的原因是&#xff0c;大多数有意义的信息都隐藏在嘈杂的数据当中。 对于许多策略开发人…

期货量化交易软软件:怎样开发可以获利的交易策略

简介 通过技术分析开发成功交易策略的过程可以分为以下几步: ​ 编辑 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 在某个资产价格图表窗口上附加几个技术指标, 并识别出其中信号指标与市场关联的模式. 把上一步相关性分析取得的数据进行公式化. …