FileDocCategorySizeDatePackage
Philosopher.javaAPI DocExample2212Tue Dec 12 18:57:46 GMT 2000None

Philosopher.java

/* 
 * This class requires no changes from the 1.0 version. 
 * It's kept here so the rest of the example can compile.
 */
import java.util.Random;

import java.awt.*;
import javax.swing.JLabel;
import javax.swing.ImageIcon;

public class Philosopher extends JLabel implements Runnable {
    private Chopstick leftStick, rightStick;
    private boolean sated;
    private DiningPhilosophers parent;
    private int position;
    Thread philThread = null;

    public Philosopher(DiningPhilosophers parent, int position, ImageIcon img) {
        super(parent.names[position], img, JLabel.CENTER);

        this.parent = parent;
        this.position = position;

        setVerticalTextPosition(JLabel.BOTTOM);
        setHorizontalTextPosition(JLabel.CENTER);

        // identify the chopsticks to my right and left
        this.rightStick = parent.chopsticks[position];
        if (position == 0) {
            this.leftStick = parent.chopsticks[parent.NUMPHILS-1];
        } else {
            this.leftStick = parent.chopsticks[position-1];
        }

        // I'm hungry
        this.sated = false;
        philThread = new Thread(this);
    }

    public void run() {
        try {
            while (true) {
	        Thread.sleep((int)(Math.random() * parent.grabDelay));
                setText("     ");
                rightStick.grab();
                setIcon(parent.imgs[parent.RIGHTSPOONDUKE]);

		Thread.sleep((int)(Math.random() * parent.grabDelay));
                leftStick.grab();
                setIcon(parent.imgs[parent.BOTHSPOONSDUKE]);

		Thread.sleep((int)(Math.random() * parent.grabDelay));
                rightStick.release();
                leftStick.release();
                setIcon(parent.imgs[parent.HUNGRYDUKE]);
                setText("Mmmm!");
                sated = true;

		Thread.sleep((int)(Math.random() * parent.grabDelay * 4));
                sated = false;
            }
        } catch (java.lang.InterruptedException e) {
        }
        leftStick.releaseIfMine();
        rightStick.releaseIfMine();
        setIcon(parent.imgs[parent.HUNGRYDUKE]);
	setText(parent.names[position]);
        sated = false;
        philThread = new Thread(this);
    }
}