java设计程序模拟三个窗口同时卖同一趟列车的票的情景(买一张票线程休眠200毫秒,初始座位200个),请给出代码必要注释。
时间: 2024-11-13 18:25:45 浏览: 28
这是一个简单的Java程序设计示例,通过模拟多线程售票的过程。我们将创建三个线程分别代表三个售票窗口,每个窗口有相同的初始座位数。当票卖出时,线程将暂停200毫秒以模拟真实场景中的购票延迟。以下是代码及必要的注释:
```java
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
class TrainTicket {
private int availableSeats; // 初始座位数
private ReentrantLock lock; // 锁对象
private Condition notAvailable; // 条件对象,当票售罄时唤醒等待的线程
public TrainTicket(int initialSeats) {
availableSeats = initialSeats;
lock = new ReentrantLock();
notAvailable = lock.newCondition();
}
public synchronized void sellTicket() throws InterruptedException {
if (availableSeats > 0) { // 如果还有票
availableSeats--;
System.out.println(Thread.currentThread().getName() + "已售出一张票,剩余" + availableSeats + "张");
notAvailable.signal(); // 唤醒一个正在等待的线程
} else { // 如果票已售完
lock.unlock(); // 先释放锁,让其他线程有机会尝试购买
wait(); // 自己进入等待状态
}
}
}
public class TicketWindow implements Runnable {
private final TrainTicket ticket;
private static final int THREAD_COUNT = 3; // 窗口数量
private static final int SLEEP_TIME_MILLIS = 200; // 模拟购票时间
public TicketWindow(TrainTicket ticket) {
this.ticket = ticket;
}
@Override
public void run() {
while (true) {
try {
ticket.sellTicket(); // 尝试购买一张票
Thread.sleep(SLEEP_TIME_MILLIS); // 模拟200毫秒购票延迟
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
TrainTicket trainTicket = new TrainTicket(200);
Thread[] windows = new Thread[THREAD_COUNT];
for (int i = 0; i < THREAD_COUNT; i++) {
windows[i] = new Thread(new TicketWindow(trainTicket), "Window " + (i+1));
windows[i].start(); // 启动窗口线程
}
// 主线程在这里结束,等待所有窗口线程停止
for (Thread window : windows) {
try {
window.join(); // 阻塞主线程直到所有窗口线程结束
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
```
在这个程序中,`TrainTicket`类表示火车票,包含可用座位数以及互斥锁和条件变量。`TicketWindow`类中的线程负责模拟售票过程。每个窗口线程无限循环地尝试购买票,直到票售完为止。`main`函数启动窗口线程并阻塞等待它们全部完成。
阅读全文