Java

//车票类
public class Ticker {
//车票应该有发出地、终点、票价等信息
    private String start;
    private String end;
    private Float price;
    public Ticker(){}
    public Ticker(String start, String end, Float price) {
        this.start = start;
        this.end = end;
        this.price = price;
    }

    public String toString(){
        StringBuilder stringBuilder = new StringBuilder("[");
        stringBuilder.append(this.start);
        stringBuilder.append("--->");
        stringBuilder.append(this.end);
        stringBuilder.append(" : ");
        stringBuilder.append(this.price);
        stringBuilder.append("]");
        return stringBuilder.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;
    }
}

import java.util.Vector;

//火车站类
public class TrainStation {
    //火车站内有多个窗口,同时开始售票
    //此类需要产生很多很多的票使多个窗口开始售票。
    //但是火车站只有一个,不能NEW多个,所以需要一个单例模式
    private static TrainStation trainStation = new TrainStation();
    private TrainStation(){}
    public static TrainStation getTrainStation(){
        return trainStation;
    }

    //票是在类加载时就需要产生的,所以需要用程序块,并且将票存储在集合内
    //集合便于更改,所以不用数组存放
    //Vector集合线程安全,且不会产生重复的 内容,
    private Vector<Ticker> vector = new Vector<Ticker>();
    {
        for(int i=1;i<=100;i++){
            vector.add(new Ticker("西安站"+i+"座次","北京站",(i%5+5)*30F));
        }
    }

    //需要一个方法,用来给窗口票
    //返回类型是Ticker类型的
    public Ticker getTicket(){
        //每给一张票,票就少一张
        try {
            return vector.remove(0);
        }catch (Exception e){
            //如果捕捉到异常,则说明票已经售完了
            return null;
        }
    }

}

//售票窗口类
public class Window extends Thread{
    //多个窗口需要同时开启,同时售票
    private String name;

    public Window(){}
    public Window(String name){
        this.name = name;
    }
    //所以需要在此类中设置Run方法
    //窗口都要售票,需要有一个售票方法
    public void sellTicket(){
        while (true){
            TrainStation trainStation = TrainStation.getTrainStation();
            Ticker ticket = trainStation.getTicket();
            if(ticket==null){
                System.out.println(this.name+"窗口票已售完!");
                break;
            }    //重写toString方法,打印对象
            System.out.println("从"+name+"售出:"+ticket);
        }
    }

    public void run(){
        sellTicket();
    }


}


public class Main {
    public static void main(String[] args){
        Window window1 = new Window("西安站1号窗口");
        Window window2 = new Window("西安站2号窗口");
        Window window3 = new Window("西安站3号窗口");
        Window window4 = new Window("西安站4号窗口");
        window1.start();
        window2.start();
        window3.start();
        window4.start();

    }
}
原文地址:https://www.cnblogs.com/yyanghang/p/11291680.html