Threads

2 respostas
Renan_UFPI

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();

}

}

2 Respostas

B

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

Renan_UFPI

“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…

Criado 23 de novembro de 2011
Ultima resposta 24 de nov. de 2011
Respostas 2
Participantes 2