用多线程实现2个售票窗口同时售卖100张票。要求用同步代码解决线程安全的问题!注意:两个窗口名字分别为“窗口1”“窗口2”.
时间: 2024-10-29 08:19:41 浏览: 30
使用多线程技术,模拟通过四个窗口卖出1000张火车票的功能。
为了实现这个场景,我们可以使用Java中的synchronized关键字和wait(), notify()方法来保证线程安全,防止竞态条件。这里是一个简单的示例:
```java
import java.util.concurrent.atomic.AtomicInteger;
class Ticket {
private static AtomicInteger remainingTickets = new AtomicInteger(100);
private static final Object window1Lock = new Object();
private static final Object window2Lock = new Object();
public synchronized static void sellTicket(String window) {
if (remainingTickets.get() > 0) {
System.out.println(window + "正在售出第" + remainingTickets.decrementAndGet() + "张票");
// 使用锁来确保每个窗口只有一个线程可以执行
if (window.equals("窗口1")) {
synchronized (window1Lock) {
window1Lock.notify();
}
} else {
synchronized (window2Lock) {
window2Lock.notify();
}
}
} else {
System.out.println(window + "已无票可售");
}
}
public static void main(String[] args) {
Thread ticketWindow1 = new Thread(() -> {
while (true) {
try {
sellTicket("窗口1");
// 等待被唤醒
synchronized (window1Lock) {
window1Lock.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
Thread ticketWindow2 = new Thread(() -> {
while (true) {
try {
sellTicket("窗口2");
// 等待被唤醒
synchronized (window2Lock) {
window2Lock.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
ticketWindow1.start();
ticketWindow2.start();
}
}
```
在这个例子中,`sellTicket`方法是`synchronized`的,保证了在同一时刻只有一个窗口在卖票。当窗口卖出票后会通知另一个窗口,通过`notify`将等待的线程唤醒并继续售票。
阅读全文