场景:有100张火车票,长途2块钱,短途1块钱,现在有三个窗口线下卖票,统计每个窗口卖的票数,多线程怎么实现,注意三个窗口都可以卖短途和长途票,短途有30张,长途有70张。
程序如下: (注意,static 修饰的成员变量作为共享变量使用的):
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class SellTicket implements Runnable {
private static int totalTicketsLong = 70; //长途票
private static int totalTicketsShort = 30; // 短途票数量
private static Lock lock = new ReentrantLock(); //创建可重入锁
private String windowName; //窗口名称
private int soldTicketsLong = 0; //售出长途票数量
private int soldTicketsShort = 0; // 售出短途票数量
public SellTicket(String windowName){
this.windowName = windowName;
}
@Override
public void run() {
while(totalTicketsLong > 0 || totalTicketsShort > 0){
//模拟卖票过程
int ticketType = (int) (Math.random() * 2); // 0 表示长途票, 1表示短途票
if (ticketType == 0 || totalTicketsLong > 0) {
sellTicketLong();
} else {
sellTicketShort();
}
}
System.out.println(windowName + " 售票结束,售出长途票:" + soldTicketsLong + " 张,售出短途票:" + soldTicketsShort + " 张");
}
private void sellTicketShort() {
lock.lock();
try {
if (totalTicketsShort > 0) {
totalTicketsShort--;
soldTicketsShort++;
System.out.println(windowName + " 售出短途票,剩余短途票:" + totalTicketsShort + " 张");
}
} finally {
lock.unlock();
}
}
private void sellTicketLong() {
lock.lock();
try {
if (totalTicketsLong > 0) {
totalTicketsLong--;
soldTicketsLong++;
System.out.println(windowName + " 售出的长途票,剩余长途票:" + totalTicketsLong + " 张");
}
} finally {
lock.unlock();
}
}
public static void main(String[] args) {
Thread window1 = new Thread(new SellTicket("窗口1"));
Thread window2 = new Thread(new SellTicket("窗口2"));
Thread window3 = new Thread(new SellTicket("窗口3"));
window1.start();
window2.start();
window3.start();
}
}
运行结果