用Java代码模拟12306售票。 编写一个模拟12306售票的系统,要求如下:假设需要抢票十次才可以抢到一张票,会员需要300毫秒抢一次,普通用户需要800毫秒抢一次。
时间: 2024-12-22 17:24:20 浏览: 5
为了模拟12306售票系统的抢票过程,我们可以创建一个简单的Java程序,使用线程池和定时任务来实现不同用户的抢票速度。这里我们假设有一个`Ticket`类表示火车票,同时有两个用户类型:会员和普通用户。以下是简化的示例代码:
```java
import java.util.concurrent.*;
public class TrainTicketSystem {
private int totalTickets = 10; // 总票数
private Ticket[] tickets = new Ticket[totalTickets]; // 初始化所有票
// 模拟抢票函数
public synchronized void grabTicket(UserType userType) throws InterruptedException {
if (tickets.length == 0) {
return;
}
for (int i = 0; i < 10 && tickets.length > 0; i++) {
if (Thread.currentThread().getName().equals(userType.getName())) {
tickets[--totalTickets] = new Ticket();
Thread.sleep(getWaitTime(userType));
System.out.printf("%s 抢到了第 %d 张票%n", userType.getName(), totalTickets + 1);
}
}
}
private long getWaitTime(UserType userType) {
switch (userType) {
case MEMBER:
return 300;
case USER:
return 800;
default:
throw new IllegalArgumentException("未知的用户类型");
}
}
enum UserType {
MEMBER("Member"),
USER("User");
private String name;
UserType(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
// 火车票类
class Ticket {
// 这里只是一个占位,实际可以添加更多信息如出发地、目的地等
}
public static void main(String[] args) throws InterruptedException {
TrainTicketSystem system = new TrainTicketSystem();
ExecutorService executor = Executors.newFixedThreadPool(5); // 使用线程池
// 启动会员和普通用户抢票
for (int i = 0; i < 2; i++) {
User user = createRandomUser();
Runnable grabber = () -> system.grabTicket(user.getType());
executor.execute(grabber);
}
executor.shutdown(); // 关闭线程池
}
private static User createRandomUser() {
Random random = new Random();
return random.nextBoolean() ? new MemberUser() : new NormalUser();
}
// 用户类型实现
abstract class User {
abstract UserType getType();
}
class MemberUser extends User {
@Override
UserType getType() {
return UserType.MEMBER;
}
}
class NormalUser extends User {
@Override
UserType getType() {
return UserType.USER;
}
}
}
```
这个程序会启动两个线程,一个是会员用户,另一个是普通用户,分别尝试抢票。每个用户尝试10次才能成功抢到一张票。注意,由于代码简化,这里的抢票过程是阻塞式的,实际上12306网站会有并发控制,真实情况可能会更复杂。
阅读全文