温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java多线程如何实现模拟12306火车站售票系统

发布时间:2021-05-27 10:17:22 来源:亿速云 阅读:352 作者:小新 栏目:开发技术

这篇文章主要介绍Java多线程如何实现模拟12306火车站售票系统,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

该系统一共涉及到3个类:

  • 车票(Ticket)

  • 12306系统(System12306)

  • 售票窗口(Window)

车票类,涉及三个属性:

  • 起始站

  • 终点站

  • 票价

public class Ticket {     //起始站     private String startStation;     //终点站     private String destination;     /**POJO对象,它里面的基本类型最好使用包装类      * 因为如果如果该类用来装从数据库中读取的信息      * 如果读取出null,那么基本类型是无法存null的,就会报错*/     //票价     private Float price;     public Ticket(){}     public Ticket(String startStation, String destination, Float price) {         this.startStation = startStation;         this.destination = destination;         this.price = price;     }     //为了让打印输出时方便,我们重写toString方法     public String toString() {         StringBuilder builder = new StringBuilder("[");         builder.append(this.startStation);         builder.append("--->");         builder.append(this.destination);         builder.append(":");         builder.append(this.price);         builder.append("]");         return builder.toString();     }     //get() and set().... }

12306系统,有一个属性—>Vector集合,有一个方法—>获取一张车票getTicket()

  • 利用Vector集合存储该系统所有的车票

  • 利用Vector的线程安全特性,同一时间只能有一个线程操作该集合,保证安全

  • 并且该系统应该是单例的

public class System12306 {     //设计一个单例模式     private System12306(){}     private static volatile System12306 sys;     public static System12306 getInstance(){         if (sys == null){             synchronized (System12306.class){                 if(sys == null)                     sys = new System12306();             }         }         return sys;     }     //属性,用一个集合存票,我们使用线程安全的Vector,或者使用Stack,它继承了Vector     private Vector<Ticket> tickets = new Vector<>();     private String[] starts = {"北京","天津","太原","运城","西安"};     private String[] ends = {"上海","武汉","苏州","深圳","昆明","广州"};     //当前系统创建后,就给tickets集合赋值     {         for(int i = 10;i<100;i++){//一共90张票             int r1 = (int)(Math.random()*starts.length);             int r2 = (int)(Math.random()*ends.length);             float price = r1*r2*5+140;             tickets.add(new Ticket(starts[r1],ends[r2],price));         }     }     //设计一个方法,从集合中获取一张票     public Ticket getTicket(){         try {             return tickets.remove(0);         }catch (Exception e){             return null;         }     } }

售票窗口类,有一个属性—>窗口名称,有一个方法—>出售车票sellTicket()

同一时间有多个窗口同时售票,该类实现了Runnable接口,达到多线程并发的效果

public class Window implements Runnable {     private String windowName;//窗口的名字     public Window(String windowName){         this.windowName = windowName;     }     @Override     public void run() {         this.sellTicket();     }     public void sellTicket(){         while (true){             System12306 sys = System12306.getInstance();             Ticket ticket = sys.getTicket();             if(ticket==null){                 System.out.println("对不起,"+windowName+"窗口车票已售完...");                 break;             }             System.out.println("从"+windowName+"窗口售出:"+ticket);         }     } }

测试代码:

public class TestMain {     public static void main(String[] args) {         Window win1 = new Window("北京西站");         Window win2 = new Window("运城北站");         Window win3 = new Window("太原南站");         new Thread(win1).start();         new Thread(win2).start();         new Thread(win3).start();     } }

多线程并发执行的效果:

Java多线程如何实现模拟12306火车站售票系统

以上是“Java多线程如何实现模拟12306火车站售票系统”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注亿速云行业资讯频道!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI