Galera, to passando por um problema com os monitores num exercicio aqui, o Barbeiro dorminhoco.
O problema eh o seguinte:
- Existe uma barbearia com um numero arbitrario de clientes N.
- Quando nao tem nenhum cliente na barbearia, o barbeiro dorme.
- Quando um cliente chega na barbearia, acorda o barbeiro pra cortar o cabelo e vai pra fila.
Os codigos estao abaixo, mas eu nao acho que esta rodando muito certo, roda sem problemas e sem travar...
Eu implementei desse jeito ate agora, com a classe Barbearia sendo meu monitor:
package src;
public class Barbearia {
private volatile int cont;
private volatile int tamanho;
public Barbearia(int a) {
this.tamanho = a;
}
private boolean estaVazia() {
if (cont == 0)
return true;
else
return false;
}
private boolean estaCheia() {
if (cont == tamanho)
return true;
else
return false;
}
public synchronized void cortarCabelo() {
while (true) {
while (estaVazia())
try{wait();} catch (InterruptedException e) {}
if (!estaVazia()) {
System.out.println("Barbeiro acordou!");
notifyAll();
cont--;
System.out.println("Barbeiro cortou um cabelo, faltam: " + cont);
}
}
}
public synchronized void irParaFila() {
if (estaCheia())
System.out.println("Fila Cheia com " + cont + " clientes, descartando!");
else {
cont++;
System.out.println("Cliente entrou para a fila que tem " + cont + " pessoas.");
notifyAll();
while(!estaCheia()) {
try {wait();} catch (InterruptedException e) {}
}
}
}
}
Cliente.java
package src;
import java.util.Random;
public class Cliente extends Thread {
private Barbearia barbearia;
private Random r = new Random();
public Cliente(Barbearia a) {
this.barbearia = a;
}
@Override
public void run() {
System.out.println("Cliente Chegou!");
try {
Thread.sleep(r.nextInt(5) * 1000);
} catch (InterruptedException e) {
}
barbearia.irParaFila();
System.out.println("Cliente foi para a fila!");
}
}
Barbeiro.java
package src;
import java.util.Random;
public class Barbeiro extends Thread {
private Barbearia barbearia;
private Random r = new Random();
public Barbeiro(Barbearia a) {
this.barbearia = a;
}
@Override
public void run() {
System.out.println("Barbeiro Criado!");
try {
Thread.sleep(r.nextInt(5) * 1000);
} catch (InterruptedException e) {
}
barbearia.cortarCabelo();
}
}