public class diningph {
public enum State { Thinking, Hungry, Eating }
private State[] state; // Each of the philosophers state
private ConditionJava[] self; // Access control to chopstick
private MutexJava mutex;
public diningph() {
state = new State[ 5 ];
self = new ConditionJava[ 5 ];
mutex = new MutexJava();
for ( int i = 0; i < 5; i++ ) {
state[ i ] = State.Thinking;
self[ i ] = new ConditionJava();
}
}
public void pickup( int who ) {
state[ who ] = State.Hungry;
int k = who + 1;
printstr( k, "will try to pickup sticks" );
print( k );
test( who );
if ( state[ who ] == State.Hungry ) {
printstr( k, "sticks are busy, will wait for them " );
synchronized ( self[ who ] ) {
self[ who ].Wait();
}
}
printstr( k, "will start eating" );
}
public synchronized void putdown( int who ) {
int k = who + 1;
printstr( k, "end eating, will putdown sticks" );
state[ who ] = State.Thinking;
test( (who + 4) % 5 );
test( (who + 1) % 5 );
}
private void test( int i ) {
if ( ( state[ (i + 4) % 5 ] != State.Eating ) &&
( state[ i ] == State.Hungry ) &&
( state[ (i + 1) % 5] != State.Eating ) ) {
state[ i ] = State.Eating;
int k = i + 1;
printstr( k, "voy a hacer signal " );
synchronized ( self[ i ] ) {
self[ i ].Signal();
}
}
}
public void print( int who ) {
mutex.Wait();
for ( int i = 0; i < 5; i++ ) {
System.out.printf( "(%d) Philosopher %d is %s \n", who, i + 1, (state[i]==State.Hungry)?"Hungry":(state[i]==State.Thinking)?"Thinking":"Eating");
}
mutex.Signal();
}
public synchronized void printstr( int who, String s ) {
mutex.Wait();
System.out.println( "Philosopher " + who + ", " + s );
mutex.Signal();
}
}