请用java编写一个程序在不使用数集的情况下模拟多个售票窗口售卖一列火车票的过程。具体的,共有10个售票窗口,每个售票窗口随机休眠一段时间后售出随机数量的车票(1~10张);每张车票有唯一的编号(例如:1~1000号);请使用同步机制确保同一编号的一张票只能被售卖一次;该列车票售卖完毕,程序运行结束。
时间: 2023-06-15 15:07:12 浏览: 98
以下是用Java实现的多线程售票窗口程序:
```java
import java.util.HashSet;
import java.util.Random;
import java.util.Set;
public class TicketSelling {
private static final int TICKET_NUM = 1000;
private static final int WINDOW_NUM = 10;
private static Set<Integer> soldTickets = new HashSet<>();
public static void main(String[] args) {
Thread[] windows = new Thread[WINDOW_NUM];
for (int i = 0; i < WINDOW_NUM; i++) {
windows[i] = new Thread(new TicketSeller(i));
windows[i].start();
}
for (Thread window : windows) {
try {
window.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private static class TicketSeller implements Runnable {
private final int id;
private final Random rand;
public TicketSeller(int id) {
this.id = id;
rand = new Random();
}
@Override
public void run() {
while (soldTickets.size() < TICKET_NUM) {
int ticket = rand.nextInt(TICKET_NUM) + 1;
synchronized (soldTickets) {
if (soldTickets.contains(ticket)) {
continue;
}
soldTickets.add(ticket);
System.out.println("Window " + id + " sold ticket " + ticket);
}
try {
Thread.sleep(rand.nextInt(1000) + 500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
```
程序中有一个`TicketSeller`类,它实现了`Runnable`接口,表示一个售票窗口。每个售票窗口随机休眠一段时间,然后售出随机数量的车票(1~10张)。每张车票有唯一的编号(例如:1~1000号),使用一个`soldTickets`集合来记录已经售出的票的编号,并使用`synchronized`关键字确保同一编号的一张票只能被售卖一次。主函数中创建了10个售票窗口,并启动它们的线程;程序运行结束时,所有窗口线程都执行完毕,票也被售卖完毕。
阅读全文