设计一个多线程程序,模拟火车售票窗口售票的功能。创建线程1和线程2,通过这两个线程共同售出100张票。 要求如下: (1)采用实现Runnable接口方式来创建多个线程; (2)要用同步代码块或同步方法来实现线程同步,解决存在的安全问题。
时间: 2024-11-06 11:18:40 浏览: 0
java多线程之火车售票系统模拟实例
设计一个多线程程序模拟火车售票窗口售票功能,我们可以按照以下步骤:
1. 首先,创建一个`Ticket`类,表示每张票,包含票号、状态(例如已售出或未售出)等属性。
```java
public class Ticket {
private int ticketId;
private boolean sold;
public Ticket(int id) {
this.ticketId = id;
this.sold = false;
}
// getters and setters for ticketId and sold
}
```
2. 创建一个实现了`Runnable`接口的`TrainTicketWindow`类,该类负责卖出票的操作,并包含了同步机制。
```java
public class TrainTicketWindow implements Runnable {
private int totalTickets;
private List<Ticket> tickets = new ArrayList<>();
private Object lock = new Object();
public TrainTicketWindow(int total) {
this.totalTickets = total;
}
@Override
public void run() {
while (totalTickets > 0) {
synchronized (lock) {
if (!tickets.isEmpty() && !tickets.get(0).sold) {
tickets.get(0).sold = true;
totalTickets--;
System.out.printf("Sold ticket %d%n", tickets.remove(0).ticketId);
} else {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
```
3. 现在我们可以创建两个售票窗口线程,分别实例化并启动它们。
```java
public static void main(String[] args) {
TrainTicketWindow window1 = new TrainTicketWindow(50);
TrainTicketWindow window2 = new TrainTicketWindow(50);
Thread thread1 = new Thread(window1, "Window 1");
Thread thread2 = new Thread(window2, "Window 2");
thread1.start();
thread2.start();
}
```
在这个例子中,我们使用了`synchronized`关键字来确保在同一时间只有一个线程可以访问修改票列表,避免了并发修改数据带来的竞态条件(race condition)。`wait()`和`notifyAll()`方法用于线程间的通信,当所有票都售罄时,窗口会等待直到有新的票可供销售。
阅读全文