开发程序设计实现 N 个售票窗口同时出售 M张 票。java语言
时间: 2024-10-09 20:07:29 浏览: 27
07-01 三个售票窗口同时出售20张票(并发)
在Java中,要实现N个售票窗口同时出售M张票的问题,你可以设计一个简单的线程池模型。首先,创建一个`Ticket`类代表每张票,并包含一些必要的属性如票号、状态等。然后,创建一个`TicketWindow`类作为窗口的抽象,它包含售票和票售罄的状态。
1. 定义`Ticket`类:
```java
public class Ticket {
private int ticketId;
private boolean available;
// 构造函数,getter和setter方法...
}
```
2. 创建`TicketWindow`类:
```java
import java.util.concurrent.*;
public abstract class TicketWindow {
private final int capacity;
private final Queue<Ticket> tickets;
private int soldTickets = 0;
public TicketWindow(int capacity) {
this.capacity = capacity;
this.tickets = new LinkedList<>();
for (int i = 1; i <= capacity; i++) {
tickets.add(new Ticket(i));
}
}
// 抽象方法,由具体子类实现
public abstract void sellTicket();
// 其他公共方法...
}
```
3. 实现具体的售票窗口类,比如`WindowA`, `WindowB`等:
```java
public class WindowA extends TicketWindow {
@Override
public synchronized void sellTicket() {
if (tickets.size() > 0 && !tickets.peek().available) {
throw new IllegalStateException("票已售罄");
}
// 购买并更新票状态
Ticket ticket = tickets.poll();
ticket.setAvailable(false);
soldTickets++;
// 可能需要异步处理,例如打印售票信息
new Thread(() -> System.out.println("窗口A卖出第" + ticket.ticketId + "号票")).start();
}
}
// 对其他窗口进行相似的实现...
```
4. 使用`ExecutorService`管理窗口:
```java
public static void main(String[] args) {
int numWindows = N;
int maxTickets = M;
ExecutorService executor = Executors.newFixedThreadPool(numWindows);
// 创建并启动每个窗口
for (int i = 1; i <= numWindows; i++) {
int windowIndex = i - 1; // 避免从0开始计数
executor.execute(new Runnable() {
@Override
public void run() {
TicketWindow window = createTicketWindow(windowIndex, maxTickets);
while (true) {
window.sellTicket();
}
}
});
}
// 关闭线程池
executor.shutdown();
}
```
在这个例子中,我们利用了Java的并发库来控制多个窗口并发运行。每个窗口都是独立的线程,通过`synchronized`关键字保证了在卖出票的操作中不会出现问题。
阅读全文