1、买票案例
需求:电影院买票,共有100张票,有3个窗口买票,设计一个程序模拟电影院买票
思路:
1、定义一个类SellTicket实现Runnable接口,里面定义一个成员变量:private int tickets = 100;
2、在SellTicket类中重写run()方法实现卖票,代码步骤如下
A:判断票数大于0,就卖票,并告知是哪个窗口卖的
B:卖了票之后,总票数减1
C:票没有了,也可能有人来问,所以这里用死循环让卖票的动作一直执行
3、定义一个测试类SellTicketDemo,里面有main方法,代码步骤如下
A:创建SellTicket类的对象
B:创建3个Thread类的对象,把SellTicket对象作为构造方法的参数,并给出对应的窗口名称
C:启动线程
package Thread06;
//定义一个类SellTicket实现Runnable接口,里面定义一个成员变量:private int tickets = 100;
public class SellTicket implements Runnable {
private int tickets = 100;
//在SellTicket类中重写run()方法实现卖票,代码步骤如下
@Override
public void run() {
//A:判断票数大于0,就卖票,并告知是哪个窗口卖的
//B:卖了票之后,总票数减1
//C:票没有了,也可能有人来问,所以这里用死循环让卖票的动作一直执行
while (true) {
if (tickets > 0) {
System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets + "张票");
tickets--;
}
}
}
}
-------------------------------------------------------------------------------
package Thread06;
/*
需求:电影院买票,共有100张票,有3个窗口买票,设计一个程序模拟电影院买票
思路:
1、定义一个类SellTicket实现Runnable接口,里面定义一个成员变量:private int tickets = 100;
2、在SellTicket类中重写run()方法实现卖票,代码步骤如下
A:判断票数大于0,就卖票,并告知是哪个窗口卖的
B:卖了票之后,总票数减1
C:票没有了,也可能有人来问,所以这里用死循环让卖票的动作一直执行
3、定义一个测试类SellTicketDemo,里面有main方法,代码步骤如下
A:创建SellTicket类的对象
B:创建3个Thread类的对象,把SellTicket对象作为构造方法的参数,并给出对应的窗口名称
C:启动线程
*/
public class SellTicketDemo {
public static void main(String[] args) {
//创建SellTicket类的对象
SellTicket st =new SellTicket();
//创建3个Thread类的对象,把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();
}
}
2、买票案例的思考
实际生活中,售票时出票也是需要时间的,所以,在出售一张票的时候,需要一点时间的延迟,修改程序:每次出票时间100毫秒,用sleep()方法实现
买票出现了问题
- 相同的票出现了多次
- 出现了负数的票
问题原因:
- 线程执行的随机性导致的
package Thread07;
//定义一个类SellTicket实现Runnable接口,里面定义一个成员变量:private int tickets = 100;
public class SellTicket implements Runnable {
private int tickets = 100;
//在SellTicket类中重写run()方法实现卖票,代码步骤如下
@Override
public void run() {
//A:判断票数大于0,就卖票,并告知是哪个窗口卖的
//B:卖了票之后,总票数减1
//C:票没有了,也可能有人来问,所以这里用死循环让卖票的动作一直执行
//相同的票出现多次
// while (true) {
// //tickets = 100;
// //t1