56 lines
1.8 KiB
Java
56 lines
1.8 KiB
Java
|
package philosopher2;
|
||
|
|
||
|
import src.Chopstick;
|
||
|
|
||
|
public class Philosopher implements Runnable {
|
||
|
private final Chopstick leftChopstick;
|
||
|
private final Chopstick rightChopstick;
|
||
|
private final boolean isRightHanded; // Asymmetry flag
|
||
|
|
||
|
public Philosopher(Chopstick leftChopstick, Chopstick rightChopstick, boolean isRightHanded) {
|
||
|
this.leftChopstick = leftChopstick;
|
||
|
this.rightChopstick = rightChopstick;
|
||
|
this.isRightHanded = isRightHanded;
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public void run() {
|
||
|
try {
|
||
|
while (true) {
|
||
|
think();
|
||
|
if (isRightHanded) {
|
||
|
synchronized (rightChopstick) {
|
||
|
rightChopstick.pickUp();
|
||
|
synchronized (leftChopstick) {
|
||
|
leftChopstick.pickUp();
|
||
|
eat();
|
||
|
leftChopstick.putDown();
|
||
|
}
|
||
|
rightChopstick.putDown();
|
||
|
}
|
||
|
} else {
|
||
|
synchronized (leftChopstick) {
|
||
|
leftChopstick.pickUp();
|
||
|
synchronized (rightChopstick) {
|
||
|
rightChopstick.pickUp();
|
||
|
eat();
|
||
|
rightChopstick.putDown();
|
||
|
}
|
||
|
leftChopstick.putDown();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
} catch (InterruptedException e) {
|
||
|
Thread.currentThread().interrupt();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private void think() {
|
||
|
System.out.println(Thread.currentThread().getName() + " is thinking.");
|
||
|
}
|
||
|
|
||
|
private void eat() {
|
||
|
System.out.println(Thread.currentThread().getName() + " is eating.");
|
||
|
}
|
||
|
}
|