import java.util.concurrent.locks.*; // Kokk og servitør // med Doug Leas concurrent-bibliotek // Stein Gjessing -> mars 2025, Magnus Skjegstad 2026- class Restaurant { public static void main(String[] args) throws InterruptedException { FellesBord fellesBord = new FellesBord(); final int antallPizzaer = 50; Kokk kokkRunP = new Kokk(antallPizzaer, fellesBord); Thread kokkTråd = new Thread(kokkRunP); kokkTråd.start(); Servitør servitørRunP = new Servitør(antallPizzaer, fellesBord); Thread servitørTråd = new Thread(servitørRunP); servitørTråd.start(); kokkTråd.join(); servitørTråd.join(); } } class Servitør implements Runnable { private FellesBord fellesBord; private int hentet = 0; private final int antallPizzaer; Servitør(int antall, FellesBord fellesBord) { this.fellesBord = fellesBord; this.antallPizzaer = antall; } @Override public void run() { while(this.hentet < this.antallPizzaer) { try { this.fellesBord.hentPizza(); this.hentet = this.hentet + 1; System.out.println("Servitør hentet pizza " + this.hentet); Thread.sleep((int)(Math.random() * 1000)); } catch (InterruptedException ex) { break; } } System.out.println("Servitøren er ferdig"); } } class Kokk implements Runnable { private FellesBord fellesBord; private int antallPizzaer; private int laget = 0; Kokk(int antallPizzaer, FellesBord fellesBord) { this.fellesBord = fellesBord; this.antallPizzaer = antallPizzaer; } @Override public void run() { while(this.laget < this.antallPizzaer) { this.laget = this.laget + 1; System.out.println("Kokken setter ut pizza " + this.laget); try { this.fellesBord.settUtPizza(); Thread.sleep((int)(Math.random() * 500)); } catch (InterruptedException ex) { break; } } System.out.println("Kokken er ferdig"); } } class FellesBord { private final int KAPASITET = 5; private int antallPizzaer = 0; private Lock lås = new ReentrantLock(); private Condition ikkeTomt = lås.newCondition(); private Condition ikkeFullt = lås.newCondition(); public void hentPizza() throws InterruptedException { lås.lock(); try { while (antallPizzaer == 0) { System.out.println("Bordet er tomt! Venter på flere pizzaer..."); ikkeTomt.await(); } antallPizzaer = antallPizzaer - 1; ikkeFullt.signalAll(); }finally { lås.unlock(); } } public void settUtPizza() throws InterruptedException { lås.lock(); try { while (antallPizzaer >= KAPASITET) { System.out.println("Bordet er fullt! Venter på servitør..."); ikkeFullt.await(); } antallPizzaer = antallPizzaer + 1; ikkeTomt.signalAll(); } finally { lås.unlock(); } } }