java多線程簡單項目--電影院售票機

來源:互聯網
上載者:User

看了網上那麼多資料和視頻,大概也知道線程的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;}}}}}
基本就這些吧~~涉及的知識太淺薄了,羞愧。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.