java多線程模擬實現12306售票


業務描述
假設有200張票,用4個線程去訂票,不能有兩個或者以上的線程訂到了
同一個票(原因就不說了),當最后一張票賣掉的時候結束,再訂就拋
異常提示出票賣完了。

業務分析,要實現以上功能,

1、需要創建一個車票類,初始化票,賣票的接口saleTicket()

2、自定義異常的一個類。

3、創建賣票線程類,在run方法中賣車票。

4、初始化車票的線程,負責初始化車票,也就是初始化Ticket類中的數組。

5、創建主方法進行測試。

 

扔上我的代碼

 

public class Ticket {
    //票務系統初始化票務信息可以容納的容量
    private String[] str = new String[1000];

    public String[] getStr() {
        return str;
    }

    public void setStr(String[] str) {
        this.str = str;
    }

    //指針指向第一張票
    private int index = 0;

    public int getIndex() {
        return index;
    }

    public void setIndex(int index) {
        this.index = index;
    }

    //初始化票務信息
    public void initializeTicket(){
        for (int i = 0; i < 200; i++) {
            str[i] = "車票編號:"+(i+1);
        }
    }
}
//賣票接口
interface SaleTicket {
    String saleTicket() throws NullTicketException;
}
public class InitializeTicket extends Thread {
    private Ticket ticket;

    public InitializeTicket(Ticket ticket) {
        this.ticket = ticket;
    }

    @Override
    public void run() {
        ticket.initializeTicket();
    }
}
public class NullTicketException extends Exception {
    public NullTicketException(){}
    public NullTicketException(String msg){
        super(msg);
    }
}
public class TicketThread extends Thread implements SaleTicket{
     private Ticket tic;
     public TicketThread(Ticket tic) {
         this.tic = tic;
     }
     @Override
     public void run() {
         for (int i = 0; i < 60; i++) {
             try {
                 String s = this.saleTicket();
                 System.out.println(this.getName()+"成功購票,購得車票--->"+s);
             } catch (NullTicketException e) {
                 System.out.println(e);
             }
         }
     }

     @Override
     public String saleTicket() throws NullTicketException {
         synchronized (tic){
             if(null != tic.getStr()[tic.getIndex()]){
                 String s =tic.getStr()[tic.getIndex()];
                 //給ticket指針向后移位
                 tic.setIndex(1+tic.getIndex());
                 return s;
             }else {
                 throw new NullTicketException("車票已售罄");
             }
         }
     }
 }
public class Test {
    public static void main(String[] args) {
        Ticket ticket = new Ticket();
        Thread formatTicket = new InitializeTicket(ticket);//初始化票務信息
        formatTicket.run();
        try {
            formatTicket.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //新建四個賣票線程
        Thread t1 = new TicketThread(ticket);
        Thread t2 = new TicketThread(ticket);
        Thread t3 = new TicketThread(ticket);
        Thread t4 = new TicketThread(ticket);
        t1.setName("1號售票口");
        t2.setName("2號售票口");
        t3.setName("3號售票口");
        t4.setName("4號售票口");
        t1.start();
        t2.start();
        t3.start();
        t4.start();
    }
}

 

測試結果如下圖


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM