用Java实验二:使用继承Thread的方式,实现三个窗口卖一百张票 1)程序运行果截图( 2)使用单线程解决问题,输出单线程和多线程的运行时间对比截图:
时间: 2024-10-19 15:16:05 浏览: 52
在Java中,我们可以使用继承自Thread类的方式来创建并启动多个线程,模拟多个窗口同时售票的情况。这里是一个简单的示例:
```java
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class TicketSeller extends JFrame implements ActionListener {
private int ticketCount = 100;
private Thread[] sellers;
public TicketSeller() {
setTitle("售票系统");
setSize(400, 200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JButton buyButton = new JButton("购买门票");
buyButton.addActionListener(this);
add(buyButton);
JLabel statusLabel = new JLabel();
add(statusLabel);
// 创建三个卖家线程
sellers = new Thread[3];
for (int i = 0; i < 3; i++) {
sellers[i] = new Thread(() -> {
while (ticketCount > 0) {
if (!(Thread.currentThread().isInterrupted())) {
sellTicket();
updateStatus();
try {
Thread.sleep(50); // 模拟售票速度
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
break;
}
}
});
sellers[i].start();
}
}
private void sellTicket() {
System.out.println("窗口" + Thread.currentThread().getName() + "卖出一张票");
ticketCount--;
}
private void updateStatus() {
statusLabel.setText("剩余票数:" + ticketCount);
}
@Override
public void actionPerformed(ActionEvent e) {
if (ticketCount > 0) {
System.out.println("窗口全部关闭");
for (Thread seller : sellers) {
seller.interrupt(); // 请求中断每个正在售票的线程
}
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(TicketSeller::new);
}
}
```
当你运行这个程序,会看到三个窗口同时进行售票,并显示剩余票数。单线程版本可以作为对比,直接在一个窗口内完成购票操作。
至于输出单线程和多线程运行时间对比的截图,这通常需要外部工具(如JProfiler、VisualVM等性能分析工具)来记录。你可以通过运行这两个版本的程序,然后使用这些工具测量并比较它们的执行时间。
阅读全文