// Kokk og servitør // med Javas iboende synkronisering // Stein Gjessing -> mars 2025 public class RestaurantJavaOld { public static void main(String[] args) { int antallPåBord = Integer.parseInt(args[0]); int antallRetter = Integer.parseInt(args[1]); FellesBord bord = new FellesBord(antallPåBord); Kokk kokk = new Kokk(bord,antallRetter); kokk.start(); Servitør servitør = new Servitør(bord,antallRetter); servitør.start(); } } class FellesBord { // En monitor private int antallPåBordet = 0; private final int BORD_KAPASITET; /* Invariant: 0 <= antallPåBordet <= BORD_KAPASITET */ public FellesBord (int ant) { BORD_KAPASITET = ant; } public synchronized void settTallerken() throws InterruptedException { // Invarianten holder while (antallPåBordet >= BORD_KAPASITET) { /* så lenge det er BORD_KAPASITET tallerkner på bordet er det ikke lov å sette på flere. */ wait(); } // Invarianten holder og nå er antallPåBordet < BORD_KAPASITET antallPåBordet++; System.out.println("Antall på bordet: " + antallPåBordet); // Invarianten holder og antallPåBord > 0; // Si fra til den som tar tallerkener: notify(); } public synchronized void hentTallerken() throws InterruptedException { // Invarianten holder while (antallPåBordet == 0) { /* Så lenge det ikke er noen talerkener pa bordet er det ikke lov å ta en */ wait(); } //Invarianten holder og nå er antallPåBordet > 0 antallPåBordet --; // Innvarianten holder fortsatt og antallPåBordet < BORD_KAPASITET // Si fra til den som setter tallerkener på bordet: notify(); } } class Kokk extends Thread { private FellesBord bord; private final int ANTALL; private int laget = 0; public Kokk(FellesBord bord, int ant) { this.bord = bord; ANTALL = ant; } @Override public void run() { try { while(ANTALL != laget) { laget ++; System.out.println("Kokken lager tallerken nr: " + laget); bord.settTallerken(); sleep((long) (500 * Math.random())); } } catch (InterruptedException e) {System.out.println("Uventet stopp 1");} } } class Servitør extends Thread { private FellesBord bord; private final int ANTALL; private int servert = 0; public Servitør(FellesBord bord, int ant) { this.bord = bord; ANTALL = ant; } @Override public void run() { try { while (ANTALL != servert) { bord.hentTallerken(); /* hent tallerken og server */ servert++; System.out.println("Kelner serverer nr:" + servert); sleep((long) (1000 * Math.random())); } } catch (InterruptedException e) {System.out.println("Uventet stopp 2");} } }