JavaSE-20.2.1【執行緒同步:案例-賣票、賣票案例存在的問題】
阿新 • • 發佈:2021-06-10
1 package day11.lesson2; 2 3 /* 4 2 執行緒同步 5 6 2.1 案例-賣票 7 8 需求 9 某電影院目前正在上映國產大片,共有100張票,而它有3個視窗賣票,請設計一個程式模擬該電影院賣票 10 11 步驟 12 定義一個類SellTicket實現Runnable介面,裡面定義一個成員變數:private int tickets = 100; 13 在SellTicket類中重寫run()方法實現賣票,程式碼步驟如下 14 判斷票數大於0,就賣票,並告知是哪個視窗賣的15 賣了票之後,總票數要減1 16 票沒有了,也可能有人來問,所以這裡用死迴圈讓賣票的動作一直執行 17 定義一個測試類SellTicketDemo,裡面有main方法,程式碼步驟如下 18 建立SellTicket類的物件 19 建立三個Thread類的物件,把SellTicket物件作為構造方法的引數,並給出對應的視窗名稱 20 啟動執行緒 21 22 2.2 賣票案例存在的問題 23 24 賣票出現了問題 25 相同的票出現了多次26 出現了負數的票 27 問題產生原因 28 執行緒執行的隨機性導致的 29 */ 30 public class SellTicket implements Runnable{ 31 32 private int tickets = 100; 33 34 @Override 35 public void run() { 36 while (true){ 37 if(tickets > 0){ 38 try { 39 Thread.sleep(100); //模擬出票時間 40 } catch (InterruptedException e) { 41 e.printStackTrace(); 42 } 43 System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets + "張票"); 44 tickets--; 45 } 46 } 47 } 48 } 49 50 class SellTicketDemo{ 51 public static void main(String[] args) { 52 SellTicket st = new SellTicket(); 53 54 Thread t1 = new Thread(st, "視窗1"); 55 Thread t2 = new Thread(st, "視窗2"); 56 Thread t3 = new Thread(st, "視窗3"); 57 58 t1.start(); 59 t2.start(); 60 t3.start(); 61 } 62 }