// // Kommentarer merket med * er nye ting som ble lagt til denne uken // Den gamle koden foer endringene ligger paa gruppesiden under uke 11 // 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(); // * Denne variabelen skal oppdateres etterhvert som baristaer blir ferdige med sin run-metode private int antallPaaJobb; // * Maa vite hvor mange som kommer paa jobb idag public Bord(int antallBaristaer) { antallPaaJobb = antallBaristaer; } // * Baristaer kaller paa denne i slutten av run() public void baristaFerdigPaaJobb() { laas.lock(); try { antallPaaJobb -= 1; if (antallPaaJobb == 0) { System.out.println("--- ( ALLE BARISTAER ER FERDIG PAA JOBB, NAA KOMMER DET IKKE MER KAFFE! )---"); // Sier ifra til alle ventende kaffedrikkere at de skal slutte aa vente kaffedrikkerCondition.signalAll(); } } finally { laas.unlock(); } } 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 // * La til 'antallPaaJobb != 0' saann at kaffedrikkeren kommer seg ut av while-loekken while (antallKaffer == 0 && antallPaaJobb != 0) { try { System.out.println("🚫 Det er ingen kaffer paa bordet! 🪑🧑🏽 Kaffedrikker setter seg aa venter ..."); kaffedrikkerCondition.await(); } catch (InterruptedException e) { System.exit(1); } } // * // Her vet vi at enten saa er antall kaffer stoerre enn 0 (og da skal det hentes en // kaffe som vanlig), ELLER saa er antallPaaJobb == 0. Om det ikke er noen paa jobb, // saa lages det jo ikke flere kaffer, og vi kan ikke hente ut en kaffe. // Derfor maa vi legge til denne if-sjekken som returnerer null om ingen jobber. if (antallPaaJobb == 0) { return null; } // 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(); } } }