// Kokk og servitor // med Javas iboende synkronisering // Stein Gjessing -> mars 2023 public class RestaurantJavaOld { public static void main(String[] args) { int antallPaBord = Integer.parseInt(args[0]); int antallRetter = Integer.parseInt(args[1]); FellesBord bord = new FellesBord(antallPaBord); Kokk kokk = new Kokk(bord,antallRetter); kokk.start(); Servitor servitor = new Servitor(bord,antallRetter); servitor.start(); } } class FellesBord { // En monitor private int antallPaBordet = 0; private final int BORD_KAPASITET; /* Invariant: 0 <= antallPaBordet <= BORD_KAPASITET */ public FellesBord (int ant) { BORD_KAPASITET = ant; } synchronized void settTallerken() throws InterruptedException { // Invarianten holder while (antallPaBordet >= BORD_KAPASITET) { /* sa lenge det er BORD_KAPASITET tallerkner pa bordet er det ikke lov aa sette pa flere. */ wait(); } // Invarianten holder og naa er antallPaBordet < BORD_KAPASITET antallPaBordet++; System.out.println("Antall paa bordet: " + antallPaBordet); // Invarianten holder og antallPaBord > 0; // Si fra til den som tar tallerkener: notify(); } synchronized void hentTallerken() throws InterruptedException { // Invarianten holder while (antallPaBordet == 0) { /* Sa lenge det ikke er noen talerkener pa bordet er det ikke lov aa ta en */ wait(); } //Invarianten holder og naa er antallPaBordet > 0 antallPaBordet --; // Innvarianten holder fortsatt og antallPaBordet < BORD_KAPASITET // Si fra til den som setter tallerkener pa 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; } public void run() { try { while(ANTALL != laget) { laget ++; System.out.println("Kokken lager tallerken nr: " + laget); bord.settTallerken(); // lag og lever tallerken sleep((long) (500 * Math.random())); } } catch (InterruptedException e) {System.out.println("Uventet stopp 1");} } } class Servitor extends Thread { private FellesBord bord; private final int ANTALL; private int servert = 0; public Servitor(FellesBord bord, int ant) { this.bord = bord; ANTALL = ant; } 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");} } }