java代码使用网络编程和线程实现现有一个在线售票系统,总共有200张票,假设4个线程同时订票,网络传输延时为5毫秒,试编写程序模拟12306的售票过程。
时间: 2024-02-20 10:00:54 浏览: 110
好的,这里是一个基于Java网络编程和多线程的实现示例,模拟了12306售票系统的过程:
```java
import java.io.*;
import java.net.*;
import java.util.concurrent.*;
public class TicketBookingSystem {
private static int totalTickets = 200;
private static final int port = 8888;
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(port);
ExecutorService executorService = Executors.newFixedThreadPool(4);
System.out.println("Ticket booking system started on port " + port);
while (totalTickets > 0) {
Socket socket = serverSocket.accept();
executorService.execute(new TicketBookingThread(socket));
}
executorService.shutdown();
serverSocket.close();
System.out.println("All tickets are booked!");
}
static class TicketBookingThread implements Runnable {
private Socket socket;
public TicketBookingThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()), true);
String request = in.readLine();
if ("book".equals(request)) {
synchronized (TicketBookingSystem.class) {
if (totalTickets > 0) {
out.println("Ticket booked: " + totalTickets);
totalTickets--;
} else {
out.println("No more tickets available");
}
}
} else {
out.println("Invalid request");
}
Thread.sleep(5);
socket.close();
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
}
}
```
在这个代码中,我们使用了Java中的 `ServerSocket` 类来创建一个服务器,并监听端口 `8888`。我们使用了 `ExecutorService` 来管理4个线程,并在每个请求到达时,将其分配给一个线程来处理。
在 `main` 方法中,我们使用了一个 `while` 循环,来保证当总票数大于0时,可以一直订票。在每次循环中,我们等待客户端的请求到达,并创建一个 `TicketBookingThread` 线程来处理它。
在 `TicketBookingThread` 类中,我们使用了一个 `Socket` 来接收客户端的请求,并使用 `BufferedReader` 和 `PrintWriter` 来处理输入和输出。我们首先读取客户端的请求,并判断是否为 `book`,如果是,则使用 `synchronized` 来保证多线程环境下的数据一致性。如果总票数大于0,则输出订购的票号,并将总票数减1;否则,输出无票信息。最后,我们使用 `Thread.sleep(5)` 来模拟网络传输延时,并关闭连接。
当所有票都被订购完后,我们关闭线程池和服务器,并输出相应信息。
这样,我们就完成了一个基于Java网络编程和多线程的模拟12306售票系统的程序。
阅读全文