77 lines
1.7 KiB
Java
77 lines
1.7 KiB
Java
package explicit;
|
|
|
|
import semaphore.Car;
|
|
import semaphore.Queue;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
import java.util.concurrent.Semaphore;
|
|
import java.util.concurrent.locks.Condition;
|
|
import java.util.concurrent.locks.ReentrantLock;
|
|
|
|
public class ExplicitValetQueue implements Queue<Car> {
|
|
private final List<Car> waitingCars;
|
|
private final int queueMaxSize;
|
|
private final ReentrantLock lock;
|
|
private final Condition full, empty;
|
|
private int firstFree = 0, firstFull = 0, nElements = 0;
|
|
|
|
|
|
public ExplicitValetQueue(int queueMaxSize) {
|
|
this.queueMaxSize = queueMaxSize;
|
|
waitingCars = new ArrayList<>(this.queueMaxSize);
|
|
|
|
for (int i = 0; i < queueMaxSize; i++) {
|
|
waitingCars.add(null);
|
|
}
|
|
|
|
lock = new ReentrantLock();
|
|
full = lock.newCondition();
|
|
empty = lock.newCondition();
|
|
}
|
|
|
|
@Override
|
|
public void put(Car element) throws InterruptedException {
|
|
lock.lock();
|
|
try {
|
|
while (nElements == this.queueMaxSize) {
|
|
full.await();
|
|
}
|
|
|
|
waitingCars.set(firstFree, element);
|
|
firstFree = (firstFree + 1) % queueMaxSize;
|
|
nElements++;
|
|
System.out.println("Car with plate " + element.getPlate() + " in queue");
|
|
System.out.println("Now waiting: " + waitingCars);
|
|
|
|
empty.signal();
|
|
} finally {
|
|
lock.unlock();
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public Car take() throws InterruptedException {
|
|
final Car c;
|
|
lock.lock();
|
|
try {
|
|
while (nElements == 0) {
|
|
empty.await();
|
|
}
|
|
|
|
c = waitingCars.get(this.firstFull);
|
|
waitingCars.set(this.firstFull, null);
|
|
firstFull = (firstFull + 1) % queueMaxSize;
|
|
nElements--;
|
|
|
|
System.out.println("Car with plate " + c.getPlate() + " will be parked now");
|
|
System.out.println("Now waiting: " + waitingCars);
|
|
|
|
full.signal();
|
|
} finally {
|
|
lock.unlock();
|
|
}
|
|
return c;
|
|
}
|
|
}
|