我正在编写一个小程序来帮助我学习 Java 中的一些多线程,但我一直坚持如何实现某些场景。
该程序模拟了一个加油站,里面也有一个咖啡馆。我希望能够创建以下场景:
- 将一个人添加到加油站队列中。
- 同时在咖啡馆的收银队列中添加一个人。
- 如果该人轮到抽水队列在轮到收银队列之前到达,允许他选择做什么(留在收银队列并退出抽水队列或相反)。
我怎样才能在这两种状态之间跳转?
到目前为止,我有这个:
人员类
public class Person implements Runnable {
private GasPump pump;
private Cashier cashier;
...
public void pumpGas() throws InterruptedException {
synchronized (this) {
pump.addCarToQueue(this);
wait();
}
synchronized (pump) {
sleep((long) (Math.random() * 5000));
pump.notify();
}
}
public void buyCoffee() throws InterruptedException {
synchronized (this) {
cashier.addCustomerToQueue(this); // standing inline
wait();
}
synchronized (cashier) {
sleep((long) (Math.random() * 5000)); // paying at cashier
cashier.notify();
}
}
...
}
气泵类
public class GasPump implements Runnable {
private Queue<Person> cars;
...
@Override
public void run() {
while (gasStation.isOpen()) {
if (!cars.isEmpty()) {
Car firstCar = cars.poll();
if (firstCar != null) {
synchronized (firstCar) {
firstCar.notifyAll();
}
} else {
// ?
}
synchronized (this) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
...
}
和收银员班
public class Cashier implements Runnable {
private Queue<Person> customers;
...
@Override
public void run() {
while(coffeeHouse.isOpen()){
if(!customers.isEmpty()){
Car firstCustomer = customers.poll();
if(firstCustomer != null){
synchronized (firstCustomer) {
firstCustomer.notifyAll();
}
}
synchronized (this) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
...
}