需求:铁路售票,一共100张,通过四个窗口卖完
思路:
- 创建一个单独的售票的类,补充售票的方法
- 创建四个线程参与售票的方法(应当注意票数的共享,否则相当于四个窗口创建了四个有100张票的对象,即总票数变为400张。)
- 在线程中限定售票的截至的条件
- 开始售票
public class practice_selltickets {
public static void main(String[] args) {
new Ticket().start(); //创建四个线程,开启线程
new Ticket().start();
new Ticket().start();
new Ticket().start();
}
}
class Ticket extends Thread{
//static Object o=new Object(); //任意对象作为锁对象,不可以,与创建了四个对象的拥有四个不同的锁对象的错误相同,除非使用Static关键字将该对象共享
private static int n=100; //将100张票变为共享的(static)
public void run() {
while(true) {
synchronized (Ticket.class) { //不能把this作为锁对象,因为创建了四个对象,所以四个锁对象不同
if (n <= 0) { //或者直接使用本类字节码对象作为锁对象,即Ticket.class(这种方法更方便)
break;
}
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(getName() + "..." + "票号" + n--);
}
}
}
}
补充:静态变量(static)
静态变量:被所有的对象共享,在内存中只有一个副本,当且仅当在类初次加载时会被初始化
非静态变量:被对象拥有,在创建对象时被初始化,存在多个副本且各个对象的副本互不影响