多线程解决窗口卖票问题 并计算运行时间 Java编写程序
时间: 2024-10-18 15:09:17 浏览: 33
在Java中,多线程可以有效地解决窗口售票系统的问题,比如在一个场景下,有多个窗口同时处理买票请求,每个窗口代表一个独立的线程。我们可以利用`Thread`类或者`Runnable`接口创建线程来模拟这种并行操作。
下面是一个简单的示例,使用了`ExecutorService`和`Callable`接口来计算每个窗口完成任务的时间,以及整个系统的总运行时间:
```java
import java.util.concurrent.*;
public class TicketWindow {
private ExecutorService executor;
private List<Future<Long>> tickets;
public TicketWindow(int numWindows) {
executor = Executors.newFixedThreadPool(numWindows);
tickets = new ArrayList<>();
}
// 模拟售票操作,耗时随机
private Callable<Long> createTicketTask(int id) {
return () -> {
try {
Thread.sleep((int)(Math.random() * 1000)); // 模拟购票时间
} catch (InterruptedException e) {
e.printStackTrace();
}
return id;
};
}
public void sellTicket(int windowId) {
Future<Long> future = executor.submit(createTicketTask(windowId));
tickets.add(future);
}
public void closeAllWindows() {
executor.shutdown();
for (Future<Long> ticket : tickets) {
try {
ticket.get(); // 等待所有窗口完成售票
} catch (Exception e) {
e.printStackTrace();
}
}
}
public long getTotalRunTime() {
long totalRunTime = 0;
for (Future<Long> ticket : tickets) {
totalRunTime += ticket.get(); // 获取单个窗口的运行时间
}
return totalRunTime;
}
public static void main(String[] args) {
TicketWindow system = new TicketWindow(5); // 创建5个窗口
for (int i = 1; i <= 20; i++) { // 每个窗口卖20张票
system.sellTicket(i);
}
system.closeAllWindows();
System.out.println("Total runtime: " + system.getTotalRunTime() + "ms");
}
}
```
在这个程序中,我们首先创建了一个固定大小的线程池,然后每次卖出一张票就提交一个新的任务到线程池。关闭窗口后,等待所有任务完成,并计算总的运行时间。
阅读全文