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(); } } }