用java编写一个程序模拟多个售票窗口售卖一列火车票的过程。具体的,共有10个售票窗口,每个售票窗口随机休眠一段时间后售出随机数量的车票(1~10张);每张车票有唯一的编号(例如:1~1000号);请使用同步机制确保同一编号的一张票只能被售卖一次;该列车票售卖完毕,程序运行结束。
时间: 2023-06-15 08:06:52 浏览: 221
以下是Java代码实现:
```java
import java.util.HashSet;
import java.util.Random;
import java.util.Set;
public class TicketSaleSimulation {
private static final int MAX_TICKET_NUM = 1000;
private static final int MAX_TICKET_PER_SALE = 10;
private static final int NUM_OF_WINDOWS = 10;
private static final Set<Integer> SOLD_TICKETS = new HashSet<>();
public static void main(String[] args) {
Window[] windows = new Window[NUM_OF_WINDOWS];
for (int i = 0; i < NUM_OF_WINDOWS; i++) {
windows[i] = new Window("Window " + (i + 1));
windows[i].start();
}
// Wait for all windows to finish
for (Window window : windows) {
try {
window.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("All tickets have been sold.");
}
private static class Window extends Thread {
private final Random rnd = new Random();
private final String name;
public Window(String name) {
this.name = name;
}
@Override
public void run() {
while (SOLD_TICKETS.size() < MAX_TICKET_NUM) {
synchronized (SOLD_TICKETS) {
int num = rnd.nextInt(MAX_TICKET_PER_SALE) + 1;
for (int i = 0; i < num; i++) {
int ticketId = rnd.nextInt(MAX_TICKET_NUM) + 1;
if (SOLD_TICKETS.contains(ticketId)) {
continue; // This ticket has been sold
}
SOLD_TICKETS.add(ticketId);
System.out.println(name + " sold ticket " + ticketId);
}
}
try {
Thread.sleep(rnd.nextInt(500)); // Simulate some delay
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
```
说明:
1. `MAX_TICKET_NUM` 定义了火车票的总数量,本例中为 1000 张。
2. `MAX_TICKET_PER_SALE` 定义了每次销售的最大数量,本例中为 10 张。
3. `NUM_OF_WINDOWS` 定义了售票窗口的数量,本例中为 10 个。
4. `SOLD_TICKETS` 定义了已售出的票的集合,使用 `Set` 来确保同一个编号的票只能售出一次。
5. `Window` 类继承 `Thread` 类,并实现了售票的逻辑。
6. 在 `run()` 方法中,使用 `synchronized` 关键字锁定 `SOLD_TICKETS` 对象,保证同一时刻只有一个窗口可以操作已售出的票的集合。
7. 在每次售票时,使用 `continue` 跳过已售出的票。
8. 在每次销售完毕后,模拟一些延迟,使得不同窗口的售票时间不同步。
9. 在 `main()` 方法中,创建并启动 10 个售票窗口,并等待所有窗口销售完毕后结束程序。
阅读全文