用JAVA8写一个多线程火车票售卖系统,用Thread,Runnable实现多线程,要使用Sleep,还要实现数据共享,有图形界面
时间: 2024-03-17 07:45:03 浏览: 66
好的,我会尽力回答你的问题。
首先,我们需要了解一下多线程的概念以及如何使用Thread和Runnable实现多线程。
多线程是指在一个程序中同时运行多个线程,每个线程都可以独立运行,互不干扰。多线程可以提高程序的执行效率,特别是在处理大量数据或需要等待某些操作完成的情况下。
在Java中,我们可以通过继承Thread类或实现Runnable接口来创建线程。继承Thread类的方式比较简单,但是由于Java只支持单继承,所以如果我们需要继承其他类的话就无法使用这种方式。因此,我们一般采用实现Runnable接口的方式来创建线程。
下面是一个简单的多线程火车票售卖系统的实现。
1. 定义一个Ticket类,表示售票系统中的一张票。
```java
public class Ticket {
private int number; // 票号
private boolean sold; // 是否已售出
public Ticket(int number) {
this.number = number;
this.sold = false;
}
public int getNumber() {
return number;
}
public boolean isSold() {
return sold;
}
public void setSold(boolean sold) {
this.sold = sold;
}
}
```
2. 定义一个TicketSeller类,表示售票员。
```java
public class TicketSeller implements Runnable {
private List<Ticket> tickets; // 所有的票
private int soldCount; // 已售票数
public TicketSeller(List<Ticket> tickets) {
this.tickets = tickets;
this.soldCount = 0;
}
@Override
public void run() {
while (soldCount < tickets.size()) {
synchronized (tickets) {
for (Ticket ticket : tickets) {
if (!ticket.isSold()) {
ticket.setSold(true);
soldCount++;
System.out.println(Thread.currentThread().getName() + "售出了第" + ticket.getNumber() + "张票");
break;
}
}
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
```
3. 定义一个TrainTicketSystem类,表示火车票售卖系统。
```java
public class TrainTicketSystem extends JFrame {
private List<Ticket> tickets; // 所有的票
private int ticketCount; // 票数
private JTextArea textArea; // 显示信息的文本框
public TrainTicketSystem(int ticketCount) {
this.ticketCount = ticketCount;
this.tickets = new ArrayList<>(ticketCount);
for (int i = 1; i <= ticketCount; i++) {
tickets.add(new Ticket(i));
}
setTitle("火车票售卖系统");
setSize(400, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
getContentPane().add(panel, BorderLayout.CENTER);
panel.setLayout(new BorderLayout(0, 0));
JScrollPane scrollPane = new JScrollPane();
panel.add(scrollPane, BorderLayout.CENTER);
textArea = new JTextArea();
textArea.setEditable(false);
scrollPane.setViewportView(textArea);
JButton btnStartSelling = new JButton("开始售票");
btnStartSelling.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
startSelling();
}
});
panel.add(btnStartSelling, BorderLayout.SOUTH);
}
private void startSelling() {
textArea.append("开始售票...\n");
TicketSeller seller1 = new TicketSeller(tickets);
TicketSeller seller2 = new TicketSeller(tickets);
Thread thread1 = new Thread(seller1, "售票员1");
Thread thread2 = new Thread(seller2, "售票员2");
thread1.start();
thread2.start();
}
}
```
4. 在main方法中启动火车票售卖系统。
```java
public class Main {
public static void main(String[] args) {
TrainTicketSystem system = new TrainTicketSystem(100);
system.setVisible(true);
}
}
```
在这个实现中,Ticket类表示售票系统中的一张票,包含票号和是否已售出两个属性。TicketSeller类表示售票员,实现了Runnable接口,run方法中使用synchronized关键字实现了对共享数据的同步访问。TrainTicketSystem类表示火车票售卖系统,使用JFrame实现了图形界面,包含一个文本框用来显示售票信息,一个开始售票的按钮,点击按钮后会创建两个线程分别模拟两个售票员进行售票。在售票员的run方法中,使用Thread.sleep方法模拟售票的过程,每售出一张票就更新已售票数并在文本框中显示售票信息。
希望这个例子能够帮助你理解如何使用Thread和Runnable实现多线程,以及如何实现数据共享。
阅读全文