赞
踩
任务需求:
java多线程模拟实现12306售票
业务描述
假设有200张票,用4个线程去订票,不能有两个或者以上的线程订到了
同一个票(原因就不说了),当最后一张票卖掉的时候结束,再订就抛
异常提示出票卖完了。
业务分析,要实现以上功能,
1、需要创建一个车票类,初始化票,卖票的接口saleTicket()
2、自定义异常的一个类。
3、创建卖票线程类,在run方法中卖车票。
4、初始化车票的线程,负责初始化车票,也就是初始化Ticket类中的数组。
5、创建主方法进行测试。
代码实现:
首先我不知道为啥要让车票类实现一个接口,感觉不是很有必要,接口里面无非也只有方法可以写,也有可能是我理解错了
- package java多线程实现12306售票;
-
- public interface SaleTicket {
- void saleTicket() ;
- }
然后是车票类,初始化车票200张,里面重写了接口的卖票方法
- package java多线程实现12306售票;
-
- public class Ticket implements SaleTicket{
- private int ticketNum=200;
-
- public Ticket() {
- }
-
- public void setTicketNum(int ticketNum) {
- this.ticketNum = ticketNum;
- }
-
- public int getTicketNum() {
- return ticketNum;
- }
-
- @Override
- public void saleTicket() {
- int before=this.getTicketNum();
- int after=this.getTicketNum()-1;
- try {
- Thread.sleep(10);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- this.setTicketNum(after);
- }
- }
然后写了一个车票票数为零的异常类,后面使用在方法里抛出
- package java多线程实现12306售票;
-
- public class ZeroTicketNum extends Exception{
- public ZeroTicketNum() {
- }
-
- public ZeroTicketNum(String message) {
- super(message);
- }
- }
接下来就是线程类了,我写了四个,其实写一个就行了,我这里是为了显示出是四个线程
这里就贴上一个线程类,其他三个一样就改下类名
- package java多线程实现12306售票;
-
- public class SaleTicketThread01 implements Runnable{
- private Ticket ticket;
-
- public SaleTicketThread01() {
- }
-
- public SaleTicketThread01(Ticket ticket) {
- this.ticket = ticket;
- }
-
- @Override
- public void run() {
- while(true){
- synchronized (ticket) {
- if (ticket.getTicketNum()==0){
- try {
- throw new ZeroTicketNum("票数为零");
- } catch (ZeroTicketNum zeroTicketNum) {
- zeroTicketNum.printStackTrace();
- }
- break;
- }
- try {
- Thread.sleep(10);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- ticket.saleTicket();
- System.out.println(Thread.currentThread().getName() + "售出一张票,现在还剩余票数为:" + ticket.getTicketNum());
- }
- }
- }
- }
下面是测试类
- package java多线程实现12306售票;
-
- public class Test {
- public static void main(String[] args) {
- Ticket ticket=new Ticket();
- Thread t1=new Thread(new SaleTicketThread01(ticket));
- Thread t2=new Thread(new SaleTicketThread02(ticket));
- Thread t3=new Thread(new SaleTicketThread03(ticket));
- Thread t4=new Thread(new SaleTicketThread03(ticket));
- t1.setName("窗口一");
- t2.setName("窗口二");
- t3.setName("窗口三");
- t4.setName("窗口四");
- t1.start();
- t2.start();
- t3.start();
- t4.start();
- }
- }
测试结果,车票票数两百好像不是很能看出区别,就是四个线程切换的频率非常的低,我把车票数量加到1000,甚至10000,四个线程才会缓慢切换,如果有更合理的方案 ,欢迎交流
- 窗口一售出一张票,现在还剩余票数为:4
- 窗口一售出一张票,现在还剩余票数为:3
- 窗口一售出一张票,现在还剩余票数为:2
- 窗口一售出一张票,现在还剩余票数为:1
- 窗口一售出一张票,现在还剩余票数为:0
- java多线程实现12306售票.ZeroTicketNum: 票数为零
- at java多线程实现12306售票.SaleTicketThread01.run(SaleTicketThread01.java:19)
- at java.base/java.lang.Thread.run(Thread.java:831)
- java多线程实现12306售票.ZeroTicketNum: 票数为零
- at java多线程实现12306售票.SaleTicketThread03.run(SaleTicketThread03.java:21)
- at java.base/java.lang.Thread.run(Thread.java:831)
- java多线程实现12306售票.ZeroTicketNum: 票数为零
- at java多线程实现12306售票.SaleTicketThread03.run(SaleTicketThread03.java:21)
- at java.base/java.lang.Thread.run(Thread.java:831)
- java多线程实现12306售票.ZeroTicketNum: 票数为零
- at java多线程实现12306售票.SaleTicketThread02.run(SaleTicketThread02.java:21)
- at java.base/java.lang.Thread.run(Thread.java:831)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。