import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; public class Kjøkken { // Faste parametere for programmet // Både public og final, trenger ikke å sikres mot synkronisering public static final int MAX_ANT_PIZZA = 50; public static final int ANT_KUNDER = 25; public static final int MAX_PIZZA_PÅ_BENKEN = 2; public static final int MAX_TID_FOR_PIZZABAKING = 500; //ms private int pizzaKlare = 0; // Kritisk region private final ReentrantLock lås = new ReentrantLock(); private final Condition benkErFull = lås.newCondition(); private final Condition benkErTom = lås.newCondition(); // Metode for pizzakokktråden public void lagPizza()throws InterruptedException{ lås.lock(); try{ // Benken er full -> vent på signal while (pizzaKlare >= MAX_PIZZA_PÅ_BENKEN){ benkErFull.await(); } // pizzaKlare++; System.out.println("Kokken lagde en pizza. Antall pizza klare: " + pizzaKlare); benkErTom.signalAll(); // Signaliser alle som har ventet ved en tom benk }finally{ lås.unlock(); } } // Metode for kundetråden public void spisPizza(int kundeID) throws InterruptedException{ lås.lock(); try{ // Ingen pizza klare -> vent på signal while (pizzaKlare == 0){ benkErTom.await(); } pizzaKlare--; System.out.println("Kunde nummer " + kundeID + " spiste en pizza. Antall pizza klare: " + pizzaKlare); benkErFull.signalAll(); // Signaliser alle som har ventet på en full benk }finally{ lås.unlock(); } } }