写出该java程序代码,并给每一行代码的思路标上注释:现有一个在线售票系统,总共有200张票,假设4个线程同时订票,网络传输延时为5毫秒,试编写程序模拟12306的售票过程。 进阶设计:试考虑同步机制。
时间: 2024-02-20 07:01:12 浏览: 89
下面是该java程序代码,带有注释说明每一行代码的思路:
```java
import java.util.concurrent.locks.ReentrantLock; // 导入可重入锁
public class OnlineTicketSystem {
private static int tickets = 200; // 总共有200张票
private static ReentrantLock lock = new ReentrantLock(); // 创建可重入锁
public static void main(String[] args) {
Thread t1 = new Thread(new BookingThread(), "Thread1"); // 创建线程1并启动
Thread t2 = new Thread(new BookingThread(), "Thread2"); // 创建线程2并启动
Thread t3 = new Thread(new BookingThread(), "Thread3"); // 创建线程3并启动
Thread t4 = new Thread(new BookingThread(), "Thread4"); // 创建线程4并启动
t1.start();
t2.start();
t3.start();
t4.start();
}
static class BookingThread implements Runnable {
public void run() {
while (true) {
lock.lock(); // 获取锁
try {
if (tickets > 0) { // 如果还有票
System.out.println(Thread.currentThread().getName() + " booked ticket " + tickets); // 输出线程名和订票信息
tickets--; // 票数减1
Thread.sleep(5); // 模拟网络传输延时
} else {
break; // 如果已经没有票,则跳出循环
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock(); // 释放锁
}
}
}
}
}
```
该程序定义了一个 `OnlineTicketSystem` 类,其中包含一个 `main` 方法和一个嵌套的静态内部类 `BookingThread`,用于模拟售票过程。
程序开始执行时,`main` 方法会创建4个线程,并启动它们。每个线程都会执行 `BookingThread` 类的 `run` 方法,该方法中通过可重入锁来保证线程安全。
当一个线程获取到锁后,会先判断是否还有票可订。如果有,则输出线程名和订票信息,并将剩余票数减1。然后模拟网络传输延时,最后释放锁。如果没有票可订,则跳出循环,线程结束。
在这个程序中,同步机制采用了可重入锁,保证了多个线程之间的访问安全。当一个线程获取到锁后,其他线程必须等待该线程释放锁后才能争夺获取锁的机会。这样就能避免多个线程同时访问共享资源导致的数据错误问题。
阅读全文