next up previous
Next: Sobre a entrega Up: Requisitos Previous: Seu arsenal

Organiza��o do programa

Crie $n$ threads ``barbeiro'' e $k$ 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) { ... }


next up previous
Next: Sobre a entrega Up: Requisitos Previous: Seu arsenal
Francisco Reverbel
2006-05-22