業務描述
假設有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(); } }
測試結果如下圖