用java编写一个程序模拟多个售票窗口售卖一列火车票的过程。具体的,共有10个售票窗口,每个售票窗口随机休眠一段时间后售出随机数量的车票(1~10张);每张车票有唯一的编号(例如:1~1000号);请使用同步机制确保同一编号的一张票只能被售卖一次;该列车票售卖完毕,程序运行结束。 提示:可设定程序中按顺序售卖车票;请使用同步机制确保程序运行正确。
时间: 2023-06-17 20:04:29 浏览: 152
以下是Java代码实现:
```java
import java.util.HashSet;
import java.util.Random;
import java.util.Set;
public class TicketSeller implements Runnable {
private static final int TICKET_AMOUNT = 1000; // 票的总数
private static final int SELLER_AMOUNT = 10; // 售票窗口数
private static final int MIN_TICKET_SOLD = 1; // 每个售票窗口最少售出票数
private static final int MAX_TICKET_SOLD = 10; // 每个售票窗口最多售出票数
private static Set<Integer> soldTickets = new HashSet<>(); // 已售出的票的编号集合
private static int ticketsSold = 0; // 已售出的票数
private int sellerId; // 售票窗口编号
private Random random = new Random(); // 随机数生成器
public TicketSeller(int sellerId) {
this.sellerId = sellerId;
}
@Override
public void run() {
while (ticketsSold < TICKET_AMOUNT) {
int ticketsToSell = random.nextInt(MAX_TICKET_SOLD - MIN_TICKET_SOLD + 1) + MIN_TICKET_SOLD;
sellTickets(ticketsToSell);
try {
Thread.sleep(random.nextInt(1000)); // 随机休眠一段时间
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private synchronized void sellTickets(int ticketCount) {
System.out.println("Seller " + sellerId + " is selling " + ticketCount + " tickets.");
for (int i = 0; i < ticketCount; i++) {
int ticketId = random.nextInt(TICKET_AMOUNT) + 1; // 生成随机的车票编号
if (soldTickets.contains(ticketId)) {
i--; // 如果该车票已售出,则重新售卖
} else {
soldTickets.add(ticketId);
ticketsSold++;
System.out.println("Seller " + sellerId + " sold ticket " + ticketId);
}
}
}
public static void main(String[] args) {
Thread[] sellers = new Thread[SELLER_AMOUNT];
for (int i = 0; i < sellers.length; i++) {
sellers[i] = new Thread(new TicketSeller(i));
sellers[i].start();
}
for (Thread seller : sellers) {
try {
seller.join(); // 等待所有售票窗口线程结束
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("All tickets sold.");
}
}
```
程序中使用了一个 `soldTickets` 集合来记录已售出的车票编号,确保同一编号的车票只能被售卖一次。在售票过程中,每个售票窗口生成随机的车票编号,如果该车票已售出,则重新售卖;否则将该车票的编号加入 `soldTickets` 集合中,并增加已售出票数。
由于多个售票窗口同时售票,需要使用同步机制来确保程序运行正确。在 `sellTickets` 方法上添加了 `synchronized` 关键字,使得每次售票操作只能由一个线程执行,避免了同一车票被重复售卖的问题。
阅读全文