12306购票模拟(线程应用)

这是一个简单的Java多线程售票系统示例,通过Vector集合确保线程安全。每个线程代表一个售票窗口,从共享的tickets集合中获取并售出火车票,直至票售罄。System12306类使用单例模式,初始化时填充tickets集合,Window类模拟售票窗口的售票过程。
摘要由CSDN通过智能技术生成
  • 购票的小例子
  • 利用Vector集合 线程安全 多个线程并发操作同一个集合的时候 不会抢夺资源
package com.uncle.testthread.system12306;

public class TestMain {

    public static void main(String[] args){
        Window w1 = new Window("北京北站");
        Window w2 = new Window("北京西站");
        Window w3 = new Window("北京南站");
        w1.start();
        w2.start();
        w3.start();
    }
}

package com.uncle.testthread.system12306;

import java.util.Vector;

public class System12306 {

    //设计一个单例模式
    private System12306(){}
    private static System12306 sys = new System12306();
    public static System12306 getInstance(){
        return sys;
    }

    //属性  集合ArrayList  Vector  synchronized  Stack
    private Vector<Ticket> tickets = new Vector<>();

    //当前系统创建后给tickets集合赋值
    {
        for(int i=10;i<100;i++){
            tickets.add(new Ticket("北京"+i,"深圳"+i,(i%5+5)*25F));
        }
    }

    //设计一个方法  从集合内获取一张火车票
    public Ticket getTicket(){
        try {
            return tickets.remove(0);
        }catch (Exception e){
            return null;
        }
    }
}

package com.uncle.testthread.system12306;

public class Ticket {

    //User类  Ticket类  没有任何逻辑
    //只是包含一些基本属性  每一个对象 小容器
    //一个对象 包含很多属性  增强可读性  类名  属性名  属性类型不一致
    //POJO  JavaBean

    private String start;//起始站名
    private String end;//终点站名
    private Float price;// null 123.4

    public Ticket(){}
    public Ticket(String start,String end,Float price){
        this.start=start;
        this.end=end;
        this.price=price;
    }

    //为了让打印输出时变得方便  打印一个对象就可以了
    //重写toString方法
    public String toString(){
        StringBuilder builder = new StringBuilder("[");
        builder.append(this.start);
        builder.append("-->");
        builder.append(this.end);
        builder.append(":");
        builder.append(this.price);
        builder.append("]");
        return builder.toString();
    }



    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;
    }
}

package com.uncle.testthread.system12306;

public class Window extends Thread {

    private String windowName;//窗口的名字
    public Window(String windowName){
        this.windowName=windowName;
    }

    public void run(){
        this.sellTicket();
    }

    public void sellTicket(){
        while(true){
            System12306 sys = System12306.getInstance();
            Ticket ticket = sys.getTicket();//Vector
            if(ticket==null){
                System.out.println("对不起"+windowName+"窗口车票已售完");
                break;
            }
            System.out.println("从"+windowName+"售出:"+ticket);
        }
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值