业务描述

假设有200张票,用4个线程去订票,不能有两个或者以上的线程订到了
同一个票(原因就不说了),当最后一张票卖掉的时候结束,再订就抛
异常提示出票卖完了。

业务分析

1、需要创建一个车票类,初始化票,卖票的接口saleTicket()2、自定义异常的一个类。3、创建卖票线程类,在run方法中卖车票。4、初始化车票的线程,负责初始化车票,也就是初始化Ticket类中的数组。5、创建主方法进行测试。

结果图

售票窗口3:2号车票已售出!
售票窗口1:1号车票已售出!
售票窗口4:3号车票已售出!
售票窗口2:4号车票已售出!
售票窗口4:5号车票已售出!
售票窗口1:6号车票已售出!
售票窗口3:7号车票已售出!
售票窗口1:8号车票已售出!
售票窗口4:9号车票已售出!
售票窗口2:10号车票已售出!
homeworkday33.TicketsSellOutException: 票已售空!at homeworkday33.Ticket.saleTickets(Ticket.java:52)at homeworkday33.SaleTicketsThread.run(SaleTicketsThread.java:18)at java.base/java.lang.Thread.run(Thread.java:832)
homeworkday33.TicketsSellOutException: 票已售空!at homeworkday33.Ticket.saleTickets(Ticket.java:52)at homeworkday33.SaleTicketsThread.run(SaleTicketsThread.java:18)at java.base/java.lang.Thread.run(Thread.java:832)
homeworkday33.TicketsSellOutException: 票已售空!at homeworkday33.Ticket.saleTickets(Ticket.java:52)at homeworkday33.SaleTicketsThread.run(SaleTicketsThread.java:18)at java.base/java.lang.Thread.run(Thread.java:832)
homeworkday33.TicketsSellOutException: 票已售空!at homeworkday33.Ticket.saleTickets(Ticket.java:52)at homeworkday33.SaleTicketsThread.run(SaleTicketsThread.java:18)at java.base/java.lang.Thread.run(Thread.java:832)Process finished with exit code 0

代码:

一个main方法
一个车票类
两个线程类
一个异常类

main方法

public class Test {public static void main(String[] args) throws InterruptedException {Ticket tickets = new Ticket(10);Thread t0 = new Thread(new InitializeTicketsThread(tickets));t0.setName("初始化车票");t0.start();//抛出异常,若车票尚未初始化完成,不可售票!//等到t0线程完成,才可继续执行main线程t0.join();Thread t1 = new Thread(new SaleTicketsThread(tickets));t1.setName("售票窗口1");t1.start();Thread t2 = new Thread(new SaleTicketsThread(tickets));t2.setName("售票窗口2");t2.start();Thread t3 = new Thread(new SaleTicketsThread(tickets));t3.setName("售票窗口3");t3.start();Thread t4 = new Thread(new SaleTicketsThread(tickets));t4.setName("售票窗口4");t4.start();}
}

车票类

public class Ticket {//字符串数组中存储每张票的名称private String[] tickets;//初始时总票数private int initialTicketNumber;//卖出车票的数量,初始化时为0private int sellOutTickets;//setter不可提供,总票数在最开始时便以确定不可更改,字符串数组在构造方法中有,也不可更改public String[] getTickets() {return tickets;}public int getInitialTicketNumber() {return initialTicketNumber;}public Ticket(int initialTicketNumber) {this.tickets = new String[initialTicketNumber];this.initialTicketNumber = initialTicketNumber;}public Ticket() {this(200);}//初始化票public void initializeTickets(){for (int i = 0; i < tickets.length; i++) {tickets[i] = (i+1) + "号车票";}}//初始化卖票的接口 saleTicketspublic synchronized String saleTickets() throws TicketsSellOutException {if ((initialTicketNumber - sellOutTickets) > 0){String ticket = tickets[sellOutTickets];//特意出现卖出同张车票的场景try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}sellOutTickets++;return ticket;}else{throw new TicketsSellOutException("票已售空!");}}
}

初始化车票线程类

/**负责初始化车票的线程**/
public class InitializeTicketsThread implements Runnable{private Ticket tickets;boolean run = true;public InitializeTicketsThread(Ticket tickets) {this.tickets = tickets;}public InitializeTicketsThread() {}@Overridepublic void run() {tickets.initializeTickets();}
}

售卖车票线程类

public class SaleTicketsThread implements Runnable{private Ticket tickets;boolean run = true;public SaleTicketsThread() {}public SaleTicketsThread(Ticket tickets) {this.tickets = tickets;}@Overridepublic void run() {while (run){try {System.out.println(Thread.currentThread().getName() +":"+ tickets.saleTickets() + "已售出!");} catch (TicketsSellOutException e) {run = false;e.printStackTrace();}}}
}

车票售空异常类

public class TicketsSellOutException extends Exception {public TicketsSellOutException() {}public TicketsSellOutException(String message) {super(message);}
}

java多线程模拟实现12306售票相关推荐

  1. java 12306 模拟登陆_java多线程模拟实现12306售票

    packagejavasimple;public classSaleTicket {public static voidmain(String[] args) {//创建一个初始化线程,若干个买票线程 ...

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

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

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

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

  4. java多线程模拟购买火车票

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. uniapp禁止遮罩层下的页面滚动
  2. JS格式化JSON串显示在表格中
  3. Java程序员需要掌握的计算机底层知识(一):CPU基本组成、指令乱序执行、合并写技术、非同一访问内存 NUMA
  4. 有一只经过训练的蜜蜂……
  5. 7-5 汉诺塔的非递归实现 (25 分)
  6. JAVAWEB入门tomcat服务器配置
  7. UVA494 Kindergarten Counting Game
  8. linux的arp指令
  9. spring-boot-route(十二)整合redis做为缓存
  10. 任务58:19-尚硅谷-Java语言基础-String类型变量的使用
  11. 汽车品牌如何运营用户?
  12. matlab之矩阵运算
  13. 点到线段的距离 计算几何
  14. 你应该知道的四种并发工具类
  15. nacos 2.0 Scanner SubTypesScanner was not configured
  16. python 拦截windows弹窗广告_Win10如何拦截桌面弹窗广告?流氓软件怎么彻底清除?...
  17. 带符号整数中负数采用什么编码_转载:二进制编码--负数
  18. 笔记本onenote绘画快捷键_OneNote 超全快捷键
  19. 程序员应该怎么学数学?
  20. ESP32设备驱动-MMA7455L加速计驱动

热门文章

  1. 机器人--寒暄库(4)
  2. Poj 3281 Regional Chengdu Food(Dicnic)
  3. Quickr for Portal相关网址
  4. 让WEB FORM更像WINDOWS FORM: 控制窗体事件
  5. 小白入门机器学习必备:编程语言环境介绍及搭建
  6. 什么是数字孪生?有哪些关键技术?现在怎么样了?
  7. CANOpen报文类型
  8. 中台设计和实践:海量并发业务中台,新业务秒级接入交易中台
  9. 偷源代码!还和前东家一起投标……最终被判 3 年
  10. UI标签库专题十二:JEECG智能开发平台 ckeditor(ckeditor插件标签)