java 请编写一个程序模拟多个售票窗口售卖一列火车票的过程。具体的,共有10个售票窗口,每个售票窗口随机休眠一段时间后售出随机数量的车票(1~10张);每张车票有唯一的编号(例如:1~1000号);请使用同步机制确保同一编号的一张票只能被售卖一次;该列车票售卖完毕,程序运行结束。
时间: 2023-06-17 15:04:17 浏览: 158
java模拟售票系统程序
以下是一个简单的 Java 代码示例,其中使用了同步机制确保每张车票只能被售卖一次:
```java
import java.util.HashSet;
import java.util.Set;
public class TrainTicketSales {
// 火车票总数量
private static final int TOTAL_TICKETS = 1000;
// 当前未售出的火车票编号集合
private static final Set<Integer> unsoldTicketIds = new HashSet<>();
// 已售出的火车票编号集合
private static final Set<Integer> soldTicketIds = new HashSet<>();
// 售票窗口数量
private static final int NUM_WINDOWS = 10;
// 每个售票窗口售票的最大数量
private static final int MAX_TICKETS_PER_WINDOW = 10;
public static void main(String[] args) throws InterruptedException {
// 初始化未售出的火车票编号集合
for (int i = 1; i <= TOTAL_TICKETS; i++) {
unsoldTicketIds.add(i);
}
// 创建并启动售票窗口线程
for (int i = 1; i <= NUM_WINDOWS; i++) {
Thread window = new Thread(new TicketSeller(), "窗口" + i);
window.start();
}
// 等待所有售票窗口线程执行完毕
for (Thread window : Thread.getAllStackTraces().keySet()) {
if (window.getName().startsWith("窗口")) {
window.join();
}
}
System.out.println("所有火车票已售出,售票结束。");
}
// 售票窗口线程类
private static class TicketSeller implements Runnable {
@Override
public void run() {
while (true) {
// 随机休眠一段时间
try {
Thread.sleep((long) (Math.random() * 1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
// 随机售出一定数量的火车票
int numTicketsToSell = (int) (Math.random() * MAX_TICKETS_PER_WINDOW) + 1;
for (int i = 0; i < numTicketsToSell; i++) {
synchronized (unsoldTicketIds) {
if (unsoldTicketIds.isEmpty()) {
// 所有火车票已经售出,退出循环
return;
}
// 随机从未售出的火车票编号集合中取出一个编号
Integer ticketId = unsoldTicketIds.iterator().next();
unsoldTicketIds.remove(ticketId);
soldTicketIds.add(ticketId);
System.out.println(Thread.currentThread().getName() + " 售出火车票 " + ticketId);
}
}
}
}
}
}
```
在该示例代码中,我们使用了 synchronized 关键字来保证在售票的过程中同一编号的火车票只会被售卖一次。当某个售票窗口线程售出一张火车票时,会先对未售出的火车票编号集合进行加锁,然后从中取出一个编号,并将其从未售出集合中移除,同时将其添加到已售出集合中。这样,其他售票窗口线程在售票的过程中就无法再售出这张火车票了。
阅读全文