看了網上那麼多資料和視頻,大概也知道線程的API怎麼用了,那就做一個項目來檢測一下知識吧~~
下面這個是測試類別,用於設定參數和開始線程,沒什麼好說的。(知識點:建立線程對象,線程開啟)
package com.thread.movticket;* 電影票系統線程測試 * 使用方法:sleep,synchronic,join,wait,notify,start,setpriority,yield * 業務功能: * vip購票通道購票,平民購票(join,wait,notify) */public class MovieTest { public static void main(String[] args){ //電影票數 int ticketAmount = 1000; //根據票數建立電影售票系統 MovieSystem movieSystem = new MovieSystem(ticketAmount); try {Thread.sleep(1000);} catch (InterruptedException e1) {// TODO Auto-generated catch blocke1.printStackTrace();} //開啟三個視窗買票,兩個平民,一個vip SaleTicket saleTicketA =new SaleTicket(movieSystem,0,ticketAmount);//電影系統對象,vip等級,票數 SaleTicket saleTicketB =new SaleTicket(movieSystem,0,ticketAmount); SaleTicket vipSaleTicket = new SaleTicket(movieSystem,1,ticketAmount); System.out.println("******鵝廠電影院開業*****"); Thread t1 = new Thread(saleTicketA,"視窗A"); Thread t2 = new Thread(saleTicketA,"視窗B"); Thread t3 = new Thread(saleTicketA,"Vip視窗"); t1.start(); t2.start(); t3.start(); }}
下面是主類(知識點:sleep())
package com.thread.movticket;public class MovieSystem {//電影票.電影票總數private int ticketAmount;private int[] ticket;public MovieSystem(int ticketAmount) {//執行個體化票數建立數組this.ticketAmount = ticketAmount;ticket = new int[ticketAmount];//給電影票以座位號劃分()for (int i=0;i<this.ticketAmount;i++) {ticket[i] = i+1;}}/* * 賣票方法 * 當票數大於0才售票,ticketAmount-1是因為票數比數組下標大1,否則告訴返回-1————“沒票啦~~” * 每售出一張票,票數減一,當前線程休眠400ms代表系統在處理資訊(其實是為了讓我們更好地觀察輸出結果) * 結果返回電影票數(也是座位號,原諒我偷懶) */public int saleTicket(){if (ticketAmount>0) {if (ticket[ticketAmount-1] > 0) {ticketAmount--;try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}return ticketAmount+1;}}return -1;//沒票}}
然後是線程類(知識點:①keepRunning停止線程②setPriority()設定線程優先順序③synchronize(object o)線程的同步鎖,個人感覺對象o沒什麼用,寫上就可以了
package com.thread.movticket;public class SaleTicket extends Thread{//共用電影系統,建立鎖對象,建立顯性對象private MovieSystem movieSystem;Object object = new Object();boolean KeepRunning = true;//private int ticketAmount;//int[] seat ;//共用電影院系統和票數,設定vip等級public SaleTicket(MovieSystem movieSystem,int viplever,int ticketAmount) {this.movieSystem = movieSystem;//根據vip等級設定快慢,目前只有普通和vip1級if (viplever == 0) {Thread.currentThread().setPriority(MIN_PRIORITY);}else if (viplever == 1) {Thread.currentThread().setPriority(MAX_PRIORITY);}}public void run() {while(KeepRunning){//儲存電影系統返回的電影票數量(座位號)並且用synchronize防止被多個線程讀取同一個座位號int num;synchronized(object){num = movieSystem.saleTicket();if (num > 0) {System.out.println(Thread.currentThread().getName()+":賣出"+num+"號座位");System.out.println("還剩"+(num-1)+"張票");}else if (num == -1) {System.out.println(Thread.currentThread().getName()+"."+"沒票了~~");KeepRunning = false;}}}}}基本就這些吧~~涉及的知識太淺薄了,羞愧。