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 }
复制代码

 

posted @   yub4by  阅读(78)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示