用java面向对象模仿12306售票系统,乘客可以在该系统抢购自己想要的车票。本案例要求编写一个模拟12306售票的系统,要求如下:假设需要抢票十次才可以抢到一张票,会员需要300毫秒抢一次,普通用户需要800毫秒抢一次。

1个回答
展开全部
摘要 bookTicket方法是同步方法,确保在多线程环境下只有一个线程可以访问它。方法首先检查是否还有剩余票可供抢购,如果没有,则返回false。然后根据乘客类型的不同(会员或普通用户),通过Thread.sleep方法模拟抢购的时间。随机选择一个座位号,如果该座位尚未被预订,则将其标记为已预订,剩余票数减一,并返回true表示抢购成功。否则,返回false表示抢购失败。
咨询记录 · 回答于2023-05-21
用java面向对象模仿12306售票系统,乘客可以在该系统抢购自己想要的车票。本案例要求编写一个模拟12306售票的系统,要求如下:假设需要抢票十次才可以抢到一张票,会员需要300毫秒抢一次,普通用户需要800毫秒抢一次。
下面是一个用Java编写的简化版12306售票系统的示例:
import java.util.Random;class TicketSystem { private int ticketsRemaining; private boolean[] seats; private Random random; public TicketSystem(int totalSeats) { this.ticketsRemaining = totalSeats; this.seats = new boolean[totalSeats]; this.random = new Random(); }
public synchronized boolean bookTicket(String passengerName, boolean isMember) { if (ticketsRemaining == 0) { return false; // 没有剩余票可供抢购 } try { Thread.sleep(isMember ? 300 : 800); } catch (InterruptedException e) { e.printStackTrace(); } int seatNumber = random.nextInt(seats.length); if (!seats[seatNumber]) { seats[seatNumber] = true; ticketsRemaining--; System.out
.println(passengerName + " 抢购成功,座位号:" + seatNumber); return true;
} else { System.out.println(passengerName + " 抢购失败"); return false; } }}class Passenger implements Runnable { private String name; private boolean isMember; private TicketSystem ticketSystem;
public Passenger(String name, boolean isMember, TicketSystem ticketSystem) { this.name = name; this.isMember = isMember; this.ticketSystem = ticketSystem; } @Override public void run() { int attempts = 0;
while (attempts < 10) { boolean success = ticketSystem.bookTicket(name, isMember); if (success) { break; } attempts++; } }}
public class Main { public static void main(String[] args) { int totalSeats = 100; // 总票数 TicketSystem ticketSystem = new TicketSystem(totalSeats); // 创建乘客线程 Thread memberThread = new Thread(new Passenger("Member1", true, ticketSystem)); Thread regularThread = new Thread(new Passenger("Regular1", false, ticketSystem));
这个示例中,我们创建了一个TicketSystem类来模拟售票系统。在TicketSystem类中,我们使用一个整数变量ticketsRemaining来跟踪剩余的票数,使用一个布尔数组seats来表示座位的状态(true表示已被预订,false表示可用)。我们还使用Random类来生成随机的座位号。
bookTicket方法是同步方法,确保在多线程环境下只有一个线程可以访问它。方法首先检查是否还有剩余票可供抢购,如果没有,则返回false。然后根据乘客类型的不同(会员或普通用户),通过Thread.sleep方法模拟抢购的时间。随机选择一个座位号,如果该座位尚未被预订,则将其标记为已预订,剩余票数减一,并返回true表示抢购成功。否则,返回false表示抢购失败。
在Main类的main方法中,我们创建了一个TicketSystem对象,并指定总的票数。然后,我们创建了一个会员乘客线程和一个普通乘客线程,并将它们分别传递给Passenger类的构造函数。最后,我们启动这两个线程,它们将并发地进行抢票操作。每个乘客最多尝试10次抢票,如果抢购成功则退出循环。
下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消