class Table
{
    private boolean[] forkUsed;
    private String[] name;

    private int left(int i) {
        return i;
    }

    private int right(int i) {
        if(i + 1 < forkUsed.length)
            return i + 1;
        else
            return 0;
    }

    public Table(int number, String[] name) {
        forkUsed = new boolean[number];
        for(int i = 0; i < forkUsed.length; i++)
            forkUsed[i] = false;

        this.name = name;
    }

    public synchronized void takeFork(int number) {
      // TODO
    }

    public synchronized void putFork(int number) {
      // TODO
}

class Philosopher extends Thread
{
    private Table table;
    private int number;
    private String name;

    public Philosopher(Table table, int number, String name) {
        this.table = table;
        this.number = number;
        this.name = name;
        start();
    }

    public void run() {
        while(true) {
            think(number);
            table.takeFork(number);
            eat(number);
            table.putFork(number);
        }
    }

    private void think(int number) {
        System.out.println(name + " (" + number + ") denkt.");
        try {
            sleep((int) (Math.random() * 20000));
        }
        catch(InterruptedException e) {
        }
    }

    private void eat(int number) {
        System.out.println(name + " ("  + number + ") fängt zu essen an.");
        try {
            sleep((int) (Math.random() * 20000));
        }
        catch(InterruptedException e) {
        }
        System.out.println(name + " (" + number + ") hört auf zu essen.");
    }
}

public class Philosophers
{
    private static final int NUMBER = 5;

    static String[] name = {"Karl Marx", "Nietzsche", "Sokrates", "Schopenhauer", "Hegel"};

    public static void main(String[] args) {
        Table table = new Table(NUMBER, name);
        for(int i = 0; i < NUMBER; i++)
            new Philosopher(table, i, name[i]);
    }
}
