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