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(); 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! Baristaen 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 ga videre i metoden } 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(); } } }