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 }