/* @author j.n.magee 25/04/98 */ package concurrency.supwork; import java.awt.*; import java.applet.*; import concurrency.connector.*; public class SupervisorWorker extends Applet { SupervisorCanvas display; WorkerCanvas red,green,yellow,blue; Button fn1,fn2,fn3; Font buttonFont = new Font("TimesRoman",Font.ITALIC,18); Font titleFont = new Font("SanSerif",Font.ITALIC+Font.BOLD,24); Thread supervisor, redWork,greenWork, yellowWork,blueWork; public void init() { setLayout(new BorderLayout()); display = new SupervisorCanvas("Supervisor", Color.cyan); add("Center",display); Panel p0= new Panel(); p0.add(fn1 = new Button("f(x) = 1 - x*x")); p0.add(fn2 = new Button("f(x) = 1-x*x*x")); p0.add(fn3 = new Button("f(x) = x*x+0.1")); fn1.setFont(buttonFont); fn2.setFont(buttonFont); fn3.setFont(buttonFont); add("South",p0); Panel p1 = new Panel(); p1.setBackground(Color.cyan); p1.setLayout(new GridLayout(6,1)); Label w = new Label("Workers"); w.setFont(titleFont); p1. add(w); p1. add(red = new WorkerCanvas(Color.red)); p1. add(green = new WorkerCanvas(Color.green)); p1. add(yellow = new WorkerCanvas(Color.yellow)); p1. add(blue = new WorkerCanvas(Color.blue)); add("East",p1); } int slice=0; private void go(Function fn) { display.reset(fn); TupleSpace bag = new TupleSpaceImpl(); redWork = new Worker(red,bag,fn); greenWork = new Worker(green,bag,fn); yellowWork = new Worker(yellow,bag,fn); blueWork = new Worker(blue,bag,fn); supervisor = new Supervisor(display,bag); redWork.start(); greenWork.start(); yellowWork.start(); blueWork.start(); supervisor.start(); } private boolean ended() { if (redWork!=null && redWork.isAlive()) return false; if (greenWork!=null && greenWork.isAlive()) return false; if (yellowWork!=null && yellowWork.isAlive()) return false; if (blueWork!=null && blueWork.isAlive()) return false; if (supervisor!=null && supervisor.isAlive()) return false; return true; } public void stop() { if (redWork!=null && redWork.isAlive()) {redWork.interrupt();redWork.stop();} if (greenWork!=null && greenWork.isAlive()) {greenWork.interrupt();greenWork.stop();} if (yellowWork!=null && yellowWork.isAlive()) {yellowWork.interrupt();yellowWork.stop();} if (blueWork!=null && blueWork.isAlive()) {blueWork.interrupt();blueWork.stop();} if (supervisor!=null && supervisor.isAlive()) {supervisor.interrupt();supervisor.stop();} } public boolean handleEvent(Event event) { if (event.id != event.ACTION_EVENT) { return super.handleEvent(event); } else if(event.target==fn1) { if (ended()) go(new OneMinusXsquared()); return true; } else if(event.target==fn2) { if (ended()) go(new OneMinusXcubed()); return true; } else if(event.target==fn3) { if (ended()) go(new XsquaredPlusPoint1()); return true; } else return super.handleEvent(event); } }