某电影院目前正在上映国产大片,共有100张票,而它有3个窗口卖票,请设计一个程序模拟该电影院卖票
卖电影票Demo
实现步骤1.SellTicket类2.SellTicketDemo测试类3.测试结果4.问题反思4.1 相同的票出现了多次4.2 出现了负数的票
实现步骤
1. 定义一个类SellTicket实现Runnable接口,里面定义一个成员变量:private int tickets = 100;
2. 在SellTicket类中重写run()方法实现卖票,代码步骤如下:
判断票数大于0,就卖票,并告知是哪个窗口卖的
卖了票之后,总票数要减1
票没有了,也可能有人来问,所以这里用死循环让卖票的动作一直执行
3. 定义一个测试类SellTicketDemo,里面有main方法,代码步骤如下:
创建SellTicket类的对象
创建三个Thread类的对象,把SellTicket对象作为构造方法的参数,并给出对应的窗口名称
4. 启动线程
1.SellTicket类
package king03
;
public class SellTicket implements Runnable {
private int tickets
= 100;
private Object obj
= new Object();
@Override
public void run() {
while (true) {
synchronized (obj
) {
if (tickets
> 0) {
try {
Thread
.sleep(100);
} catch (InterruptedException e
) {
e
.printStackTrace();
}
System
.out
.println(Thread
.currentThread().getName() + "正在出售第" + tickets
+ "张票");
tickets
--;
}
}
}
}
}
2.SellTicketDemo测试类
package king03
;
public class SellTicketDemo {
public static void main(String
[] args
) {
SellTicket st
= new SellTicket();
Thread t1
= new Thread(st
, "窗口1");
Thread t2
= new Thread(st
, "窗口2");
Thread t3
= new Thread(st
, "窗口3");
t1
.start();
t2
.start();
t3
.start();
}
}
3.测试结果
从100张一直售卖完最后一张,没有全部截图
4.问题反思
4.1 相同的票出现了多次
最终分析是因为线程执行的随机性导致的,三个线程先后启动,但是都是在执行同一个操作,造成了一张票同时在3个窗口都卖出去了。 解决办法: 使用synchronized同步代码块锁定,使只能同时一个线程运行,这样就可以避免出现这个问题
4.2 出现了负数的票
依旧是线程的问题,在三个线程先后抢到CPU的执行权的时候,都会执行ticket--的操作,使之输出了-1的票数,延迟之后输出异常,锁定线程之后就可以解决了