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集合,同时在系统类加载时我们就需要集合中有数据,所以我们可以用代码块(在类加载的时候就执行)来进行集合中的数据添加,同时我们要保证每个窗口出的票是基于同一个系统对象,所以我们需要用单例模式来进行设计系统类

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

java多线程模拟购买火车票相关推荐

  1. Java多线程 模拟 购买 退订 机票

     Java多线程 模拟 购买 退订 机票 package cn.com.cloud.sea.thread; /*** @author HenryLee* @version 1.0* 买票*/ publ ...

  2. java多线程模拟龟兔赛跑,JAVA多线程模拟龟兔赛跑

    JAVA多线程模拟龟兔赛跑! class Rabbit extends Thread{ Tortoise tor; int Journey; int RabbitSpeed; public Rabbi ...

  3. Java多线程模拟售票系统

    Java创建多线程的两种基本方法: 方法1.继承Thread类 (1)定义子类,继承Thread类,重写该类的run()方法作为线程执行体; (2)创建该子类的实例作为线程对象; (3)调用线程对象的 ...

  4. 利用JAVA多线程模拟售票系统,对统一资源进行处理

    首先多线程处理统一资源的方式有两种 分别介绍一下两者的区别 synchronized与Lock的区别 1.Lock不是Java语言内置的,synchronized是Java语言的关键字 2.synch ...

  5. Java多线程模拟加工厂加工玩具

    创建工厂类, 属性包括:车间类的对象的集合,仓库容量 方法包括: 1. 加工玩具的方法(product),方法的功能是各个车间同时工作.根据仓库容量平均分配给各个车间需要加工玩具的数量.2. 建造玩具 ...

  6. Java 多线程 模拟银行ATM实时存取钱

    近期想回顾一些知识: 一.Java 多线程 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务.多线程是多任务的一种特别的形式,但多线程使用了更小的资源开 ...

  7. Java多线程 模拟售票窗口售票

    编写一个Java 多线程程序,完成三个售票窗口同时出售20张票 程序分析: 1.票数要使用同一个静态值: 2.为保证不会出现卖出同一个票数,要java多线程同步锁. 设计思路: 创建一个站台类Stat ...

  8. Java:多线程模拟多站点售票过程

    这是一个在并发状态下对共享资源的多线程访问.这些访问必须是互斥的进行,因为涉及到对资源的修改.假设现在销售火车票.目的地有3个,分别是北京,天津和上海.使用一个枚举类型表示. Destation.ja ...

  9. Java 多线程模拟卖票

    完成操作系统作业Java模拟多线程卖票 /*** @Author: crush* @Date: 2021-05-12 16:24* version 1.0*/ public class SellTic ...

最新文章

  1. 变量命名规范 匈牙利 下划线 骆驼 帕斯卡
  2. SpringBoot中实现批量文件上传
  3. 台湾大学林轩田机器学习技法课程学习笔记16(完结) -- Finale
  4. 《数据库原理与应用》(第三版) 第 5 章 数据类型及关系表创建 基础 习题参考答案
  5. Dubbo之RPC架构
  6. (十四)消息中间件MQ详解及四大MQ比较
  7. 《黑马程序员》 block的使用(Objective - c语法)
  8. html5播放器占用带宽情况,分享|用 bmon 查看网络带宽使用情况
  9. 基于.net开发chrome核心浏览器【五】
  10. 贪吃蛇c语言作业ppt,c语言贪吃蛇
  11. 用计算机读取三菱PLC程序,电脑如何读取与保存三菱plc数据?
  12. 萤石开放平台 .net c# sdk
  13. Ubuntu安装过程之磁盘分区图文教程
  14. 会员积分商城系统的功能介绍
  15. win10安装Geany编辑器
  16. 《Fluent Python》读书笔记-2.5
  17. 如何使用基础的conda
  18. 远程ARM设备Xavier方法——ZeroTier+nomachine
  19. 一沙一世界,一叶一春秋
  20. Unreal引擎术语表

热门文章

  1. 资源不准下的网络故障定位探索
  2. ODIS是一款专业的多功能车辆诊断系统
  3. MIUI7 系统应用精简(米5、红米note3)
  4. 文件系统、服务、防火墙、SELINUX——安全四大金刚
  5. Thinkpad T470p 在 Ubuntu 20.04 启用指纹识别
  6. 计算机程序设计基础课程设计(C语言)[2023-02-28]
  7. javascript中网页 url 与字符串之间的转换
  8. ERROR: You appear to be running an X server; please exit X before installing
  9. 数字孪生智慧火电解决方案
  10. python 无头模式_搭建谷歌浏览器无头模式抓取页面服务,laravel-php-python-docker !!!...