import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Bord {
private int antallKaffer = 0;
private String[] kaffer = new String[4];
private Lock laas = new ReentrantLock();
private Condition baristaCondition = laas.newCondition();
private Condition kaffedrikkerCondition = laas.newCondition();
// 1. Lurt aa la bordet ha en oversikt over antall baristaer som er paa jobb naa
public void leggTilKaffe(String nyKaffe) {
laas.lock();
try {
// Baristaen maa sette seg aa vente dersom bordet er fullt
// Maa vente helt til en Kaffedrikker henter en kaffe og det blir en ledig plass
while (antallKaffer >= kaffer.length) {
try {
System.out.println("? Bordet er fullt! ????? Barista setter seg og venter...");
baristaCondition.await();
// await() soerger for at laaser bli unlock'ed
// Baristaen maa faa laasen foer den kan slutte aa vente og fortsette videre
} catch (InterruptedException e) {
System.exit(1);
}
}
// Setter den nye kaffen paa bordet
kaffer[antallKaffer] = nyKaffe;
antallKaffer += 1;
// Sier ifra til alle eventuelt ventende Kaffedrikkere
// at naa staar det en kaffe paa bordet
kaffedrikkerCondition.signalAll();
} finally {
laas.unlock();
}
}
public String hentKaffe() {
laas.lock();
try {
// Kaffedrikkeren maa sette seg aa vente dersom det ikke er noen kaffe paa bordet
// Maa vente helt til en Barista setter en kaffe paa bordet
while (antallKaffer == 0) {
try {
System.out.println("? Det er ingen kaffer paa bordet! ??? Kaffedrikker setter seg aa venter ...");
kaffedrikkerCondition.await();
} catch (InterruptedException e) {
System.exit(1);
}
}
// Henter en kaffe fra bordet
antallKaffer -= 1;
String kaffen = kaffer[antallKaffer];
kaffer[antallKaffer] = null;
// Sier ifra til alle eventuelt ventende Baristaer
// at naa er det en ledig plass paa bordet
baristaCondition.signalAll();
return kaffen;
} finally {
laas.unlock();
}
}
}