meu codigo ta dando starvation, no caso os homens ficam esperando e nunca entram no “banheiro”, poderiam me ajudar? estou usando o wait e notify de forma errada?
segue o codigo:
CLASSE BANHEIRO
public class Banheiro extends Thread{
private static int homensDentro;
private static int mulheresDentro;
private static int filaHomem;
private static int filaMulher;
private static int sexo;
public Banheiro(int sexo) {
mulheresDentro = 0;
homensDentro = 0;
filaHomem = 0;
filaMulher = 0;
this.sexo = sexo;
}
public synchronized void filaBanheiro(int sexo) {
switch (sexo) {
case 1: if (filaHomem < 10)
filaHomem++;
case 2: if (filaMulher < 10)
filaMulher++;
}
}
public synchronized void entraBanheiro(int sexo) {
switch (sexo) {
case 1: if (homensDentro < 3 && mulheresDentro == 0 && filaMulher == 0) {
// TODO Auto-generated catch block
filaHomem--;
homensDentro++;
System.out.println("Um homem entrou no banheiro, total de " + homensDentro + " homem(ns)");
} else if (homensDentro == 3)
System.out.println("Já existem 3 homens ocupando o banheiro" );
else if (mulheresDentro > 0)
System.out.println("Homem, não entre! Pois existe(m) " + mulheresDentro + " mulher(es) no banheiro");
case 2: if (mulheresDentro < 3 && homensDentro == 0) {
try {
filaMulher--;
mulheresDentro++;
System.out.println("Uma mulher entrou no banheiro, total de " + mulheresDentro + " mulher(es)" );
wait(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else if (mulheresDentro == 3)
System.out.println("Já existem 3 mulheres ocupando o banheiro" );
else if (homensDentro > 0)
System.out.println("Mulher, não entre! Pois existe(m) " + homensDentro + " homem(ns) no banheiro" );
}
}
public synchronized void saiBanheiro(int sexo) {
switch (sexo) {
case 1: if (homensDentro > 0) {
homensDentro--;
System.out.println("Um homem saiu do banheiro, total de " + homensDentro + " homem(en)" );
notify();
}
case 2: if (mulheresDentro > 0) {
mulheresDentro--;
System.out.println("Uma mulher saiu do banheiro, total de " + mulheresDentro + " mulher(es)" );
notify();
}
}
}
public void run() {
for (int i=0; i<10; i++) {
if (sexo == 1) {
try {
filaBanheiro(sexo);
entraBanheiro(sexo);
sleep((long) (Math.random() * 2));
saiBanheiro(sexo);
sleep((long) (Math.random() * 2));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else {
try {
filaBanheiro(sexo);
entraBanheiro(sexo);
sleep((long) (Math.random() * 2));
saiBanheiro(sexo);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
MAIN
public class Exbanheiro2 {
public static void main(String[] args) {
Banheiro mulher = new Banheiro(2);
Banheiro homem = new Banheiro(1);
homem.start();
mulher.start();
}
}