// 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");} } }