测试类
public class Test {
public static void main(String[] args) {
show s = new show();
//给线程重新命名,并传入参数,调用 start 方法 **注意,此处千万不能使用show对象构造方法,进行售票人员命名
new Thread(s, "售票口1").start(); //若是用show的构造方法,进行售票人员命名,会出现每个窗口都卖100张票的情况
new Thread(s, "售票口2").start();
new Thread(s, "售票口3").start();
new Thread(s, "售票口4").start();
}
}
车票类
class show implements Runnable {
ReentrantLock lock = new ReentrantLock();
private int ticket = 100;
public void run() {
//while(true) { //使用while循环,可以统计一共卖票情况
for(int i = 1;;i++){ //使用for循环,可以统计每个窗口的买票情况,选择使用
// synchronized(this){
lock.lock(); //此处可用synchronized 和 lock ,但使用位置千万注意 , 若是将锁放在while外面,会出现一个窗口将票卖空的情况
try {
if (ticket >= 1) {
System.out.println(Thread.currentThread().getName() + "卖出了QF1908第" + (100-ticket+1) + "张票,还剩" + (--ticket) + "张");
//System.out.println(Thread.currentThread().getName() + "卖出了QF1908第" + i + "张票,还剩" + (--ticket) + "张");
} else {
System.out.println("对不起,"+Thread.currentThread().getName()+"今日车票已售空");
return;
}
} finally {
lock.unlock();
}
}
}
}