从A到B,100张车票,10个窗口售卖,一个窗口一条线程,票卖完之后窗口结束,代码实现
时间: 2024-10-14 19:15:08 浏览: 13
这是一个典型的并发场景,我们可以使用Java的synchronized关键字和wait/notify机制来实现。假设每个窗口有一个售票锁(mutex),并维护一个票数列表。以下是简单的代码示例:
```java
import java.util.concurrent.CopyOnWriteArrayList;
class Ticket {
int id;
}
class Window implements Runnable {
private int windowId;
private CopyOnWriteArrayList<Ticket> tickets;
private boolean soldOut = false;
public Window(int windowId) {
this.windowId = windowId;
this.tickets = new CopyOnWriteArrayList<>();
// 初始化票数
for (int i = 1; i <= 100; i++) {
tickets.add(new Ticket());
}
}
@Override
public void run() {
while (!soldOut) {
synchronized (this) {
if (tickets.isEmpty()) {
soldOut = true;
notifyAll(); // 票售完,通知其他线程
} else {
// 获取一张票并解锁
Ticket ticket = tickets.remove(0);
// 销售操作...
System.out.println("Window " + windowId + " sold ticket " + ticket.id);
// 锁定,等待下一张票
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
public class Main {
public static void main(String[] args) {
Thread[] threads = new Thread[10];
for (int i = 0; i < 10; i++) {
threads[i] = new Thread(new Window(i));
threads[i].start();
}
}
}
```
在这个代码里,`Window`类代表每个售票窗口,`run()`方法中通过`synchronized`关键字保证了售票过程的原子性,当所有票卖出后会唤醒还在等待的线程。`CopyOnWriteArrayList`用于防止在多线程环境下修改集合导致的数据竞争。
阅读全文