写出该java代码,并给出每一行代码的思路:现有一个在线售票系统,总共有200张票,假设4个线程同时订票,网络传输延时为5毫秒,试编写程序模拟12306的售票过程。 进阶设计:试考虑同步机制。
时间: 2024-02-19 11:59:01 浏览: 67
多线程售票案例Java代码_加锁不会重复_且支持乱序取票,可以设置只售数量。 比如总共有100张票,设置只售10张。
以下是Java代码和每行代码的思路:
```java
public class TicketSystem {
private static int totalTickets = 200; // 总共有200张票
private static int soldTickets = 0; // 已售出的票数
public synchronized static boolean buyTicket(int num) { // 同步方法,保证线程安全
try {
Thread.sleep(5); // 模拟网络传输延时为5毫秒
} catch (InterruptedException e) {
e.printStackTrace();
}
if (totalTickets - soldTickets >= num) { // 判断是否有足够的票数
soldTickets += num; // 更新已售出的票数
return true; // 购票成功
} else {
return false; // 购票失败
}
}
public static void main(String[] args) {
Runnable r = new Runnable() {
@Override
public void run() {
for (int i = 0; i < 50; i++) { // 每个线程购买50张票
if (buyTicket(1)) {
System.out.println(Thread.currentThread().getName() + "购买了1张票,剩余票数:" + (totalTickets - soldTickets));
} else {
System.out.println(Thread.currentThread().getName() + "购买失败,剩余票数:" + (totalTickets - soldTickets));
}
}
}
};
Thread t1 = new Thread(r, "线程1");
Thread t2 = new Thread(r, "线程2");
Thread t3 = new Thread(r, "线程3");
Thread t4 = new Thread(r, "线程4");
t1.start();
t2.start();
t3.start();
t4.start();
}
}
```
思路:
1. 定义一个名为TicketSystem的类,表示售票系统;
2. 定义一个静态变量totalTickets,表示总共有200张票;
3. 定义一个静态变量soldTickets,表示已售出的票数;
4. 定义一个同步方法buyTicket,参数为购买的票数num,返回值为boolean类型,表示购票是否成功;
5. 在buyTicket方法中,使用Thread.sleep(5)模拟网络传输延时为5毫秒;
6. 在buyTicket方法中,使用同步块保证线程安全;
7. 在buyTicket方法中,判断是否有足够的票数,如果有,则更新已售出的票数并返回true,否则返回false;
8. 在main方法中,定义一个实现了Runnable接口的匿名类r,表示购票线程;
9. 在匿名类r中,使用for循环购买50张票;
10. 在匿名类r中,调用buyTicket方法购买票,并根据返回值输出购票结果;
11. 在main方法中,定义4个线程t1、t2、t3、t4,分别启动购票线程r;
12. 整个程序模拟了12306的售票过程,使用同步机制保证线程安全。
阅读全文