/* * Copyright (c) 1995-1997 Sun Microsystems, Inc. All Rights Reserved. * * Permission to use, copy, modify, and distribute this software * and its documentation for NON-COMMERCIAL purposes and without * fee is hereby granted provided that this copyright notice * appears in all copies. Please refer to the file "copyright.html" * for further important copyright and licensing information. * * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. */ import java.awt.*; class Philosopher extends Thread { Chopstick leftStick, rightStick; double x, y; boolean sated; PhilosopherArea parent; int position; boolean stopRequested = false; Philosopher(PhilosopherArea parent, double x, double y, int position) { super(parent.names[position]); this.parent = parent; this.position = position; this.x = x; this.y = y; // identify the chopsticks to my right and left this.rightStick = this.parent.chopsticks[position]; if (position == 0) { this.leftStick = this.parent.chopsticks[this.parent.NUMPHILS-1]; } else { this.leftStick = this.parent.chopsticks[position-1]; } // I'm hungry this.sated = false; } public void run() { int grabDelay; while (stopRequested == false) { try { grabDelay = parent.controller.grabDelaySlider.getValue() * 100; sleep((int)(Math.random() * grabDelay)); rightStick.grab(this); parent.repaintPhil(position); grabDelay = parent.controller.grabDelaySlider.getValue() * 100; sleep((int)(Math.random() * grabDelay)); leftStick.grab(this); parent.repaintPhil(position); grabDelay = parent.controller.grabDelaySlider.getValue() * 100; sleep((int)(Math.random() * grabDelay)); eat(); grabDelay = parent.controller.grabDelaySlider.getValue() * 100; sleep((int)(Math.random() * grabDelay * 4)); sated = false; parent.repaintPhil(position); } catch (java.lang.InterruptedException e) { } } } public void eat() { rightStick.release(this); leftStick.release(this); sated = true; parent.repaintPhil(position); } public void paint(Graphics g) { g.setColor(Color.lightGray); g.fillRect((int)x, (int)y, parent.imgs[0].getWidth(parent), parent.imgs[0].getHeight(parent)+25); if (sated == false) { if (rightStick.owner == this && leftStick.owner != this) { // got left only g.drawImage(parent.imgs[1], (int)x, (int)y, parent); } else if (rightStick.owner == this && leftStick.owner == this) { // got both g.drawImage(parent.imgs[2], (int)x, (int)y, parent); } else { // got nothing g.drawImage(parent.imgs[0], (int)x, (int)y, parent); } } else { g.drawImage(parent.imgs[0], (int)x, (int)y, parent); g.setColor(Color.black); g.drawString("Mmm!", ((int)(x)+8), ((int)(y)+parent.imgs[0].getHeight(parent)+13)); } } public void stopRequested() { stopRequested = true; } }