Problema com monitores

0 respostas
R

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();
	}
}
Criado 20 de setembro de 2011
Respostas 0
Participantes 1