import java.util.concurrent.Semaphore;
public class DiningPhilosophers {
static Fork[] forks = new Fork[6];
static Philosopher[] philosophers = new Philosopher[6];
public static void main(String[] args) {
for(int i = 0; i < 6; i++) {
forks[i] = new Fork();
}
for(int i = 0; i < 6; i++) {
philosophers[i] = new Philosopher("P" + i, forks[i], forks[(i + 1) % 6]);
}
for(int i = 0; i < 6; i++) {
philosophers[i].start();
}
for(int i = 0; i < 6; i++) {
try {
philosophers[i].join();
}
catch(InterruptedException e) {
}
}
}
static class Fork {
Semaphore fork_semaphore = new Semaphore(1);
void take_fork() {
try {
fork_semaphore.acquire();
}
catch (InterruptedException e) {
}
}
void put_back_fork() {
fork_semaphore.release();
}
}
static class Philosopher extends Thread {
String name;
Fork left_fork;
Fork right_fork;
Philosopher(String _name, Fork _left, Fork _right) {
name = _name;
left_fork = _left;
right_fork = _right;
}
@Override
public void run() {
left_fork.take_fork();
right_fork.take_fork();
eat();
left_fork.put_back_fork();
right_fork.put_back_fork();
think();
}
void eat() {
System.out.println(name + " is eating!");
try {
Thread.sleep(100);
}
catch (InterruptedException e) {
}
}
void think() {
System.out.println(name + " is thinking!");
}
}
}
/// 1 2 3 4 5 6