现有一个在线售票系统,总共有200张票,假设4个线程同时订票,网络传输延时为5毫秒,试编写程序模拟12306的售票过程。用Java语言写出程序代码并给出每一行代码的注释
时间: 2024-02-21 21:57:39 浏览: 90
好的,以下是我为您编写的Java代码,每一行都有注释说明:
```java
import java.util.concurrent.locks.ReentrantLock;
public class TicketBookingSystem {
private static int numOfTickets = 200; // 总票数
private static final ReentrantLock lock = new ReentrantLock(); // 定义一个可重入锁
public static void main(String[] args) {
// 创建4个线程,模拟4个人同时订票
new Thread(new BookingThread(), "user1").start();
new Thread(new BookingThread(), "user2").start();
new Thread(new BookingThread(), "user3").start();
new Thread(new BookingThread(), "user4").start();
}
static class BookingThread implements Runnable {
@Override
public void run() {
while (true) {
lock.lock(); // 上锁
try {
if (numOfTickets > 0) { // 如果还有票
System.out.println(Thread.currentThread().getName() + "订到了第" + numOfTickets + "张票");
numOfTickets--; // 减少一张票
} else { // 如果已经售完
System.out.println("对不起," + Thread.currentThread().getName() + ",当前余票不足。");
break; // 跳出循环
}
} finally {
lock.unlock(); // 解锁
}
try {
Thread.sleep(5); // 模拟网络传输延时
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
```
这个程序使用了 `ReentrantLock` 可重入锁来保证线程安全。在 `BookingThread` 类中,每个线程会不断地循环尝试上锁,如果上锁成功就订票并减少一张票,否则就说明已经售完,跳出循环。同时,每次订票之后使用 `Thread.sleep()` 来模拟网络传输延时。
阅读全文