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