1. 程式人生 > 其它 >JavaSE-20.2.1【執行緒同步:案例-賣票、賣票案例存在的問題】

JavaSE-20.2.1【執行緒同步:案例-賣票、賣票案例存在的問題】

 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 }