开发程序设计实现 N 个售票窗口同时出售 M张 票。创建一个售票窗口类 TicketWindow,继承Thread,重写run方法,在run方法里面执行售票操作!售票要使用同步锁:即有一个站台卖这张票时,其他站台要等这张票卖完!用java语言
时间: 2024-10-09 21:07:13 浏览: 21
在Java中,如果你想让`TicketWindow`类继承自`Thread`并重写`run`方法来实现N个售票窗口同时出售M张票,你需要确保并发安全性,确保在售卖过程中只有一个窗口可以处理一张票。这里是一个基本的示例:
```java
import java.util.LinkedList;
import java.util.Queue;
public class Ticket implements Comparable<Ticket> {
private int id;
private boolean sold;
public Ticket(int id) {
this.id = id;
this.sold = false;
}
// getters and setters
@Override
public int compareTo(Ticket other) {
return Integer.compare(this.id, other.id);
}
}
public class TicketWindow extends Thread {
private final int capacity;
private Queue<Ticket> tickets;
private int soldTickets = 0;
private Object lock = new Object(); // 用于同步售票过程
public TicketWindow(int capacity) {
this.capacity = capacity;
this.tickets = new LinkedList<>();
for (int i = 1; i <= capacity; i++) {
tickets.offer(new Ticket(i));
}
}
@Override
public void run() {
while (true) {
// 获取锁
synchronized (lock) {
// 检查是否有未售出的票
if (!tickets.isEmpty()) {
Ticket ticket = tickets.poll();
soldTickets++;
// 更新票的状态并释放锁
ticket.setSold(true);
lock.notifyAll();
// 打印售票信息
System.out.printf("窗口 %d 卖出第 %d 号票%n", Thread.currentThread().getId(), ticket.getId());
} else {
// 没有票可卖,等待其他窗口售完
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
// 供外部调用,模拟售票操作
public void startSelling() {
start();
}
}
public class Main {
public static void main(String[] args) {
int nWindows = 5; // N个窗口
int maxTickets = 10; // M张票
for (int i = 0; i < nWindows; i++) {
TicketWindow window = new TicketWindow(maxTickets);
window.startSelling();
}
}
}
阅读全文