请用Java编写一个程序模拟多个售票窗口售卖一列火车票的过程。具体的,共有10个售票窗口,每个售票窗口随机休眠一段时间后售出随机数量的车票(1~10张);每张车票有唯一的编号(例如:1~1000号);请使用同步机制确保同一编号的一张票只能被售卖一次;该列车票售卖完毕,程序运行结束。 提示:可设定程序中按顺序售卖车票;请使用同步机制确保程序运行正确。
时间: 2023-06-16 14:05:41 浏览: 105
以下是Java程序的实现:
```java
import java.util.HashSet;
import java.util.Random;
import java.util.Set;
public class TicketSeller {
public static void main(String[] args) {
Set<Integer> tickets = new HashSet<>();
for (int i = 1; i <= 1000; i++) {
tickets.add(i);
}
TicketSellerRunnable[] runnables = new TicketSellerRunnable[10];
for (int i = 0; i < 10; i++) {
runnables[i] = new TicketSellerRunnable(tickets, i);
new Thread(runnables[i]).start();
}
}
}
class TicketSellerRunnable implements Runnable {
private Set<Integer> tickets;
private int windowNum;
private Random random = new Random();
public TicketSellerRunnable(Set<Integer> tickets, int windowNum) {
this.tickets = tickets;
this.windowNum = windowNum;
}
@Override
public void run() {
while (!tickets.isEmpty()) {
synchronized (tickets) {
if (!tickets.isEmpty()) {
int numTickets = random.nextInt(10) + 1;
for (int i = 0; i < numTickets; i++) {
int ticket = tickets.iterator().next();
tickets.remove(ticket);
System.out.println("Window " + windowNum + " sold ticket " + ticket);
}
}
}
try {
Thread.sleep(random.nextInt(1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
```
解释:
1. 在 `main` 方法中,我们首先创建了一个 `Set` 对象 `tickets` 来存储所有的车票编号(1~1000),然后创建了10个 `TicketSellerRunnable` 对象,并将它们放到不同的线程中运行。
2. 在 `TicketSellerRunnable` 类中,我们首先使用同步机制来保证同一时间只有一个线程能够访问 `tickets` 集合,然后在集合不为空的情况下,每个线程随机售卖1~10张车票,保证同一编号的车票只会被售卖一次。
3. 最后,每个线程随机休眠一段时间后继续售票,直到所有的车票都被售卖完毕。
这个程序使用了同步机制来确保程序运行的正确性,可以正确地模拟多个售票窗口售卖一列火车票的过程。
阅读全文