设计一个多线程程序,模拟火车售票窗口售票的功能。创建线程1和线程2,通过这两个线 程共同售出100张票。 要求如下: (1)采用实现Runnable接口方式来创建多个线程; (2)要用同步代码块或同步方法来实现线程同步,解决存在的安全
时间: 2024-11-09 16:22:56 浏览: 60
设计一个多线程火车售票窗口售票功能,可以使用Java的`Thread`类和`Runnable`接口来创建两个售票线程。这里是一个简单的示例:
```java
import java.util.concurrent.atomic.AtomicInteger;
class Ticket implements Runnable {
private static AtomicInteger ticketCount = new AtomicInteger(100);
private int ticketId;
public Ticket(int id) {
this.ticketId = id;
}
@Override
public void run() {
while (ticketCount.get() > 0) {
if (isTicketAvailable()) {
System.out.printf("Ticket %d sold by Thread %s%n", ticketId++, Thread.currentThread().getName());
sellTicket();
synchronized (this) {
notify();
}
} else {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
System.out.println(Thread.currentThread().getName() + ": All tickets sold out.");
}
private boolean isTicketAvailable() {
return ticketCount.decrementAndGet() >= 0;
}
private void sellTicket() {
// 票务操作,比如数据库更新、库存减一等
// 这里简化为打印
System.out.println(Thread.currentThread().getName() + " sold a ticket at time " + System.currentTimeMillis());
}
}
public class TrainTicketOffice {
public static void main(String[] args) {
TicketThread thread1 = new TicketThread(new Ticket(1));
TicketThread thread2 = new TicketThread(new Ticket(2));
thread1.start();
thread2.start();
}
}
class TicketThread extends Thread {
public TicketThread(Ticket ticket) {
super(ticket, "Ticket Window");
setDaemon(true); // 设置为主线程的子线程,在主线程结束时自动退出
}
@Override
public void run() {
ticket.run(); // 调用Ticket类的run方法执行售票逻辑
}
}
```
在这个例子中,我们定义了一个`Ticket`类实现了`Runnable`接口,包含售票状态检查、卖票以及同步控制的代码。两个线程分别实例化`TicketThread`并启动,它们会共享`TicketCount`原子整数来进行同步,确保不会同时卖出两张票。
同步机制通过`wait()`和`notify()`方法保证了只有当有票可售时,线程才会进入卖票阶段;无票时,线程会释放锁等待。
阅读全文