/* @author j.n.magee 14/11/96 */ package concurrency.carpark; import java.awt.*; import java.applet.*; import concurrency.display.*; /*********************CARPARK CONTROL*****************************/ class CarParkControl { protected int spaces; protected int capacity; CarParkControl(int n) { capacity = spaces = n; } synchronized void arrive() throws InterruptedException { while (spaces==0) wait(); --spaces; notifyAll(); } synchronized void depart() throws InterruptedException{ while (spaces==capacity) wait(); ++spaces; notifyAll(); } } /*******************ARRIVALS************************/ class Arrivals implements Runnable { CarParkControl carpark; Arrivals(CarParkControl c) { carpark = c; } public void run() { try { while(true) { ThreadPanel.rotate(330); carpark.arrive(); ThreadPanel.rotate(30); } } catch (InterruptedException e){} } } /********************DEPARTURES*******************************/ class Departures implements Runnable { CarParkControl carpark; Departures(CarParkControl c) { carpark = c; } public void run() { try { while(true) { ThreadPanel.rotate(180); carpark.depart(); ThreadPanel.rotate(180); } } catch (InterruptedException e){} } } /****************************APPLET**************************/ public class CarPark extends Applet { final static int Places = 4; ThreadPanel arrivals; ThreadPanel departures; CarParkCanvas carDisplay; public void init() { super.init(); // Set up Display arrivals = new ThreadPanel("Arrivals",Color.blue); departures = new ThreadPanel("Departures",Color.yellow); carDisplay = new CarParkCanvas("CarPark",Places,this); GridBagLayout gridbag = new GridBagLayout(); setLayout(gridbag); GridBagConstraints gc = new GridBagConstraints(); gc.anchor = GridBagConstraints.NORTH; gridbag.setConstraints(carDisplay, gc); gridbag.setConstraints(arrivals, gc); gridbag.setConstraints(departures, gc); add(arrivals); add(carDisplay); add(departures); } public void start() { CarParkControl c = new DisplayCarPark(carDisplay,Places); arrivals.start(new Arrivals(c)); departures.start(new Departures(c)); } public void stop() { arrivals.stop(); departures.stop(); } } /**************************************************************/ class DisplayCarPark extends CarParkControl { CarParkCanvas disp; boolean occupied[]; DisplayCarPark(CarParkCanvas disp,int size) { super(size); this.disp = disp; occupied = new boolean[size]; for (int i=0; i