用java写出题目: 编写程序实现多线程售卖火车票,要求如下: (1)假设售票厅有四个窗口可发售某日某次列车的100张车票。 (2)出售的火车票不能出现重复的票号、大于100的票、小于0的票。 (3)在控制台中打印每个窗口对应售出的票。
时间: 2023-11-27 17:51:56 浏览: 132
题目描述:
编写程序实现多线程售卖火车票,要求如下:
(1)假设售票厅有四个窗口可发售某日某次列车的100张车票。
(2)出售的火车票不能出现重复的票号、大于100的票、小于0的票。
(3)在控制台中打印每个窗口对应售出的票。
Java代码实现:
```java
import java.util.HashSet;
import java.util.Random;
import java.util.Set;
public class TicketSeller implements Runnable {
private static final int TICKET_NUM = 100;
private static final int WINDOW_NUM = 4;
private static final Set<Integer> soldTickets = new HashSet<>();
private static final Object lock = new Object();
private final int windowId;
public TicketSeller(int windowId) {
this.windowId = windowId;
}
@Override
public void run() {
int soldNum = 0;
while (soldNum < TICKET_NUM) {
int ticketNo = new Random().nextInt(TICKET_NUM) + 1;
if (ticketNo <= 0 || ticketNo > TICKET_NUM || soldTickets.contains(ticketNo)) {
continue;
}
synchronized (lock) {
if (soldTickets.contains(ticketNo)) {
continue;
}
soldTickets.add(ticketNo);
}
System.out.println("Window " + windowId + " sold ticket " + ticketNo);
soldNum++;
}
}
public static void main(String[] args) {
for (int i = 0; i < WINDOW_NUM; i++) {
new Thread(new TicketSeller(i + 1)).start();
}
}
}
```
代码解析:
该程序通过实现Runnable接口,创建多个线程来模拟多个售票窗口。
在每个线程中,使用一个while循环不断地售出票,直到售出所有票。
每次售票时,使用随机数生成售出的票号。如果票号不合法或已经售出过,则跳过这次售票。
如果售出的票号合法且未被售出,则使用synchronized关键字实现线程同步,将该票号添加到已售出的票集合中。
最后,在控制台中输出每个窗口售出的票号。
阅读全文