Threads

Pessoal, estou com um problema com o codigo que segue, trata-se do clássico “filosofos glutoes”.

No sentido figurado seria assim: Os filosofos sentam em volta de um pato. São colocados um garfo a direita de cada filosofo, cada filosofo tem que comer com 2 garfos, isto é, vai ter que usar o garfo de uma pessoa que está do lado. O problema justamente está em 2 filosofos, um do lado do outro, comer ao mesmo tempo. Isto vai causar um conflito entre os 2.

quando executo, gera “starvation”, alguem poderia me ajudar a fazer com que o estado de inanição fosse evitado?!

package filosofoglutoes;

public class Filosofos {

int[] garfos = {1, 1, 1};
Filosofo f1 = new Filosofo(0);
Filosofo f2 = new Filosofo(1);
Filosofo f3 = new Filosofo(2);

// pegar
public synchronized void take_fork(int i) {
    do {
        if (garfos[i] == 0) {
            try {
                wait();
            } catch (Exception e) {
                e.printStackTrace();
            }
        } else {
            garfos[i] = garfos[i] - 1;
        }
    } while (garfos[i] == 0);
}

// devolver
public synchronized void put_fork(int i) {
    if (garfos[i] == 0) {
        notify();
    }
    garfos[i] = garfos[i] + 1;
}

public Filosofos() {
    f1.start();
    f2.start();
    f3.start();
}

public class Filosofo extends Thread {

    int numero;

    public void run() {
        while (true) {
            pensar();
            take_fork(numero);
            take_fork( (numero + 1) % garfos.length);
            comer();
            put_fork(numero);
            put_fork((numero + 1) % garfos.length);
            dormir();
        }

    }

    public Filosofo(int id) {
        numero = id;
    }

    public void dormir() {
        System.out.println("Filosofo:" + numero + " dormindo!");
    }

    public void comer() {
        System.out.println("Filosofo:" + numero + " comendo!");
    }

    public void pensar() {
        System.out.println("Filosofo:" + numero + " pensando!");

    }
}

}

package filosofoglutoes;

public class Simulador {

public static void main(String[] args) {

     Filosofos f = new Filosofos();

}

}

Veja as quatro soluções possíveis, e tente implementar uma delas em seu programa.

“Bezier curve”, vlw pela sugestão, por sinal eu já tinha lido sobre a utilização de semaforo para solucionar esse problema, eu so nao vi nada implementado, ai nao sei como utilizar…