Crie threads ``barbeiro'' e
threads ``cliente''.
A vida de um cliente � muito mon�tona: ele vai at� a barbearia para
cortar seu cabelo (pode ser que n�o consiga, caso a barbearia esteja
cheia), depois faz outras coisas menos importantes (ou seja, espera um
tempo aleat�rio), depois vai cortar seu cabelo novamente.
A vida de um barbeiro tamb�m � mon�tona: ele pega um cliente,
corta o cabelo dele (ou seja, espera um tempo aleat�rio), avisa esse
cliente que o corte acabou e passa para o pr�ximo cliente.
A sa�da do seu programa deve indicar que barbeiro est� atendendo a que cliente (ou seja, o programa associa uma identificador a cada barbeiro e a cada cliente).
Uma das classes do programa deve implementar conceitualmente um monitor que encapsula todos os acessos � barbearia. O ``conceitualmente'' aqui indica que voc� provavelmente n�o far� uma tradu��o direta do monitor em classe Java, com synchronized em todos os m�todos p�blicos, pois isso n�o � adequado para o caso de m�ltiplas condi��es (a menos tamb�m se use chamadas notifyAll()). Esse monitor tem os m�todos indicados abaixo:
monitor Barbearia { // Campos (vari�veis privadas) do monitor ... // Opera��o chamada pelos clientes: boolean cortaCabelo() { ... } // se a barbearia n�o estiver lotada, espera // que o corte seja feito e retorna true // se a barbearia estiver lotada, retorna false // Opera��es chamadas pelos barbeiros: void proximoCliente() { ... } // pega o pr�ximo cliente (dentro desta chamada // o barbeiro pode dormir esperando um cliente) void corteTerminado() { ... } // o barbeiro acorda o cliente que est� na sua // cadeira e espera que ele saia da barbearia // (tome cuidado para acordar o cliente certo) }
Se achar conveniente, adicione aos m�todos proximoCliente() e corteTerminado() um par�metro que identifica o barbeiro que atender� ou atendeu o cliente:
void proximoCliente(int idBarbeiro) { ... } void corteTerminado(int idBarbeiro) { ... }