import java.lang.*; import java.awt.*; import java.applet.*; import java.applet.Applet; import java.awt.Graphics; import java.applet.AudioClip; public class winkel extends Applet { final private int MAXBUFFER = 3, GEEN = -1, AANTALPROD = 5, AANTALKLANT = 5; private int aantalProd, aantalWachtKlant, aantalWachtProd, numProd, numKlant; private Label aantalProdLabel, numKlantLabel, numProdLabel, aantalWachtProdLabel, aantalWachtKlantLabel; private consument[] klanten; private producent[] producenten; private Thread[] producentenThread; public void init() { int i; setLayout(new GridLayout(5, 2)); // geef de instance-variabelen een waarde. aantalProd = 0; aantalWachtKlant = 0; aantalWachtProd = 0; numProd = 0; numKlant = 0; // add alle Labels. //1e regel add(new Label("Aantal producten in voorraad:")); aantalProdLabel = new Label(Integer.toString(aantalProd)); add(aantalProdLabel); //2e regel add(new Label("Nummer van de klant die een product koopt:")); numKlantLabel = new Label(Integer.toString(numKlant)); add(numKlantLabel); //3e regel add(new Label("Nummer van de producent die een product levert:")); numProdLabel = new Label(Integer.toString(numProd)); add(numProdLabel); //4e regel add(new Label("Aantal wachtende klanten:")); aantalWachtKlantLabel = new Label(Integer.toString(aantalWachtKlant)); add(aantalWachtKlantLabel); //5e regel add(new Label("Aantal wachtende producenten:")); aantalWachtProdLabel= new Label(Integer.toString(aantalWachtProd)); add(aantalWachtProdLabel); //maak de producenten aan producenten = new producent[AANTALPROD]; for (i = 0; i < AANTALPROD; i++) producenten[i] = new producent(i + 11, this); //maak de klanten aan klanten = new consument[AANTALKLANT]; for (i = 0; i < AANTALKLANT; i++) klanten[i] = new consument(i + 11, this); } public void paint(Graphics g) { //Geeft alle (numerieke) Labels de correcte waarde aantalProdLabel.setText(Integer.toString(aantalProd)); numKlantLabel.setText(Integer.toString(numKlant)); numProdLabel.setText(Integer.toString(numProd)); aantalWachtKlantLabel.setText(Integer.toString(aantalWachtKlant)); aantalWachtProdLabel.setText(Integer.toString(aantalWachtProd)); } synchronized void brengProd(int numProducent) throws InterruptedException { if (aantalProd == MAXBUFFER) { // leverancier moet wachten tot het product afgeleverd kan worden aantalWachtProd++; while (aantalProd == MAXBUFFER) { try { wait(); } catch(InterruptedException e) { }; } aantalWachtProd--; } aantalProd++; numProd = numProducent; notifyAll(); repaint(); Thread.sleep(4000); Thread.currentThread().setPriority((int)(Math.random() * Thread.MAX_PRIORITY)); } synchronized void haalProd(int nummerKlant) throws InterruptedException { if (aantalProd == 0) { aantalWachtKlant++; while (aantalProd == 0) { try { wait(); } catch(InterruptedException e) { }; } aantalWachtKlant--; } aantalProd--; numKlant = nummerKlant; notifyAll(); repaint(); Thread.sleep(3117); Thread.currentThread().setPriority((int)(Math.random() * Thread.MAX_PRIORITY)); } } class consument implements Runnable { private int numKlant; private winkel winkel; private Thread runner; consument(int numKlant, winkel winkel) { this.winkel = winkel; this.numKlant = numKlant; runner = new Thread(this); runner.start(); } public synchronized void run() { Thread thisThread = Thread.currentThread(); while (runner == thisThread) { try { winkel.haalProd(numKlant); } catch (InterruptedException e){} } } } class producent implements Runnable { private winkel winkel; private int numProd; private Thread runner; producent (int numProd, winkel winkel) { this.winkel = winkel; this.numProd = numProd; runner = new Thread(this); runner.start(); } public synchronized void run() { Thread thisThread = Thread.currentThread(); while (runner == thisThread) { try { winkel.brengProd(numProd); } catch (InterruptedException e){} } } }