当前位置:   article > 正文

java多线程模拟12306售票(北京动力节点Java基础课程第七章多线程作业题其二)_12306座位分配逻辑 java

12306座位分配逻辑 java

任务需求:

java多线程模拟实现12306售票

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

业务分析,要实现以上功能,

    1、需要创建一个车票类,初始化票,卖票的接口saleTicket()

    2、自定义异常的一个类。

    3、创建卖票线程类,在run方法中卖车票。

    4、初始化车票的线程,负责初始化车票,也就是初始化Ticket类中的数组。

    5、创建主方法进行测试。

代码实现:

首先我不知道为啥要让车票类实现一个接口,感觉不是很有必要,接口里面无非也只有方法可以写,也有可能是我理解错了

  1. package java多线程实现12306售票;
  2. public interface SaleTicket {
  3. void saleTicket() ;
  4. }

然后是车票类,初始化车票200张,里面重写了接口的卖票方法

  1. package java多线程实现12306售票;
  2. public class Ticket implements SaleTicket{
  3. private int ticketNum=200;
  4. public Ticket() {
  5. }
  6. public void setTicketNum(int ticketNum) {
  7. this.ticketNum = ticketNum;
  8. }
  9. public int getTicketNum() {
  10. return ticketNum;
  11. }
  12. @Override
  13. public void saleTicket() {
  14. int before=this.getTicketNum();
  15. int after=this.getTicketNum()-1;
  16. try {
  17. Thread.sleep(10);
  18. } catch (InterruptedException e) {
  19. e.printStackTrace();
  20. }
  21. this.setTicketNum(after);
  22. }
  23. }

然后写了一个车票票数为零的异常类,后面使用在方法里抛出

  1. package java多线程实现12306售票;
  2. public class ZeroTicketNum extends Exception{
  3. public ZeroTicketNum() {
  4. }
  5. public ZeroTicketNum(String message) {
  6. super(message);
  7. }
  8. }

接下来就是线程类了,我写了四个,其实写一个就行了,我这里是为了显示出是四个线程

这里就贴上一个线程类,其他三个一样就改下类名

  1. package java多线程实现12306售票;
  2. public class SaleTicketThread01 implements Runnable{
  3. private Ticket ticket;
  4. public SaleTicketThread01() {
  5. }
  6. public SaleTicketThread01(Ticket ticket) {
  7. this.ticket = ticket;
  8. }
  9. @Override
  10. public void run() {
  11. while(true){
  12. synchronized (ticket) {
  13. if (ticket.getTicketNum()==0){
  14. try {
  15. throw new ZeroTicketNum("票数为零");
  16. } catch (ZeroTicketNum zeroTicketNum) {
  17. zeroTicketNum.printStackTrace();
  18. }
  19. break;
  20. }
  21. try {
  22. Thread.sleep(10);
  23. } catch (InterruptedException e) {
  24. e.printStackTrace();
  25. }
  26. ticket.saleTicket();
  27. System.out.println(Thread.currentThread().getName() + "售出一张票,现在还剩余票数为:" + ticket.getTicketNum());
  28. }
  29. }
  30. }
  31. }

下面是测试类

  1. package java多线程实现12306售票;
  2. public class Test {
  3. public static void main(String[] args) {
  4. Ticket ticket=new Ticket();
  5. Thread t1=new Thread(new SaleTicketThread01(ticket));
  6. Thread t2=new Thread(new SaleTicketThread02(ticket));
  7. Thread t3=new Thread(new SaleTicketThread03(ticket));
  8. Thread t4=new Thread(new SaleTicketThread03(ticket));
  9. t1.setName("窗口一");
  10. t2.setName("窗口二");
  11. t3.setName("窗口三");
  12. t4.setName("窗口四");
  13. t1.start();
  14. t2.start();
  15. t3.start();
  16. t4.start();
  17. }
  18. }

测试结果,车票票数两百好像不是很能看出区别,就是四个线程切换的频率非常的低,我把车票数量加到1000,甚至10000,四个线程才会缓慢切换,如果有更合理的方案 ,欢迎交流

  1. 窗口一售出一张票,现在还剩余票数为:4
  2. 窗口一售出一张票,现在还剩余票数为:3
  3. 窗口一售出一张票,现在还剩余票数为:2
  4. 窗口一售出一张票,现在还剩余票数为:1
  5. 窗口一售出一张票,现在还剩余票数为:0
  6. java多线程实现12306售票.ZeroTicketNum: 票数为零
  7. at java多线程实现12306售票.SaleTicketThread01.run(SaleTicketThread01.java:19)
  8. at java.base/java.lang.Thread.run(Thread.java:831)
  9. java多线程实现12306售票.ZeroTicketNum: 票数为零
  10. at java多线程实现12306售票.SaleTicketThread03.run(SaleTicketThread03.java:21)
  11. at java.base/java.lang.Thread.run(Thread.java:831)
  12. java多线程实现12306售票.ZeroTicketNum: 票数为零
  13. at java多线程实现12306售票.SaleTicketThread03.run(SaleTicketThread03.java:21)
  14. at java.base/java.lang.Thread.run(Thread.java:831)
  15. java多线程实现12306售票.ZeroTicketNum: 票数为零
  16. at java多线程实现12306售票.SaleTicketThread02.run(SaleTicketThread02.java:21)
  17. at java.base/java.lang.Thread.run(Thread.java:831)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/632087
推荐阅读
相关标签
  

闽ICP备14008679号