java编写程序实现多线程售卖火车票,要求如下:(1)假设售票厅有四个窗口可发售某日某次列车的100张车票。 (2)出售的火车票不能出现重复的票号、大于100的票、小于0的票。 (3)在控制台中打印每个窗口对应售出的票
时间: 2023-11-27 20:51:52 浏览: 123
以下是一个简单的 Java 线程安全的程序,实现了多线程售卖火车票的功能。
```java
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class TicketSeller implements Runnable {
private static int ticketCount = 100;
private static int sellerCount = 4;
private static Lock lock = new ReentrantLock();
private int sellerId;
public TicketSeller(int sellerId) {
this.sellerId = sellerId;
}
@Override
public void run() {
while (ticketCount > 0) {
lock.lock(); // 获取锁
try {
if (ticketCount > 0) { // 确认火车票还有余量
int ticketNo = ticketCount; // 当前售出的票号
ticketCount--; // 更新余票数量
System.out.println(String.format("售票窗口%d售出第%d张火车票", sellerId, ticketNo));
}
} finally {
lock.unlock(); // 释放锁
}
}
}
public static void main(String[] args) {
for (int i = 0; i < sellerCount; i++) {
new Thread(new TicketSeller(i + 1)).start(); // 创建并启动售票员线程
}
}
}
```
以上程序使用了 `java.util.concurrent.locks.Lock` 接口及其实现类 `java.util.concurrent.locks.ReentrantLock` 实现了线程安全。通过 `lock` 对象的 `lock()` 方法获取锁,执行售票操作,然后使用 `unlock()` 方法释放锁,以便其他售票员线程可以访问 `ticketCount` 变量。由于使用了锁,线程之间的访问会互斥,保证了线程安全。
阅读全文