设计一个多线程程序,模拟火车售票窗口售票的功能。创建线程1和线程2,通过这两个线程共同售出100张票。 要求如下: (1)采用实现Runnable接口方式来创建多个线程; (2)要用同步代码块或同步方法来实现线程同步,解决存在的安全问题。
时间: 2024-11-20 07:35:15 浏览: 51
为了设计一个多线程程序模拟火车售票窗口,我们可以按照以下步骤操作:
1. **定义Ticket类**:这是基础的票类,包含票的数量属性以及一个减一的操作。
```java
public class Ticket {
private int ticketCount = 100;
public synchronized void sell() {
if (ticketCount > 0) {
ticketCount--;
System.out.println(Thread.currentThread().getName() + "卖出一张票,剩余:" + ticketCount);
} else {
System.out.println("票已售完");
}
}
}
```
2. **创建Thread类实现Runnable接口**:我们将Ticket类作为Runnable接口的实现,并在run()方法中处理售票操作。
```java
public class TrainTicket implements Runnable {
private final Ticket ticket;
public TrainTicket(Ticket ticket) {
this.ticket = ticket;
}
@Override
public void run() {
while (true) {
ticket.sell();
try {
// 线程睡眠一小段时间,模拟售票过程
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
```
3. **创建并启动两个线程**:我们创建两个TrainTicket实例,分别放入两个独立的线程。
```java
public class Main {
public static void main(String[] args) {
Ticket ticket = new Ticket();
Thread thread1 = new Thread(new TrainTicket(ticket), "窗口1");
Thread thread2 = new Thread(new TrainTicket(ticket), "窗口2");
// 启动线程
thread1.start();
thread2.start();
// 等待所有线程结束
try {
thread1.join();
thread2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("售票结束");
}
}
```
4. **添加同步控制**:为了防止多个线程同时访问Ticket的sell()方法导致数据不一致,我们在Ticket类的sell()方法上加了`synchronized`关键字。这使得每次只有一个线程可以执行这个方法。
在这个程序中,线程1和线程2会交替卖票,直到所有的票售完为止。每个线程内部有循环和sleep,模拟真实场景中购票的流程。
阅读全文