Trabalho I

Thread e Mecanismos de Escalonamento do Java

Descrição

Nesta atividade de laboratório você deve simular uma competição de caça às moedas. Em um bosque existem 20 potes com 4 moedas cada. Existem 3 caçadores de moeda (amarelo, verde e azul) e cada um tem 2 cachorros. Cada caçador envia seus cachorros para procurar os potes e quando um encontra um pote com moedas ele consegue levar até 3 moedas do pote. Após isso, o cachorro vai procurar o próximo pote, o qual é escolhido aleatoriamente dentre as opções disponíveis na malha da figura abaixo, inclusive pode voltar para o pote anterior  Por exemplo, o cachorro verde, após coletar moedas no pote 2, deve escolher aleatoriamente um caminho para o pote 1, 3, 4 ou 5. Se um cachorro encontrar um pote vazio, ele deve dormir no pote até que o cachorro salva-vida (o vermelho) coloque uma moeda no pote para que o cachorro preso possa levar e seguir seguir sua missão. O cachorro vermelho visita todos os potes (de acordo com a ordem numérica) para determinar os que estão vazios. Para esses potes vazios, o cachorro vermelho deve colocar 1 moeda.

A regra da competição é que só deve ter, no máximo, 3 cachorros no bosque e cada pote só pode ser acessado por apenas um cachorro por vez (região crítica). Quando um cachorro tiver 20 moedas ele deve voltar imediatamente (e diretamente) para o dono, entregar as moedas e voltar para fila de entrada do bosque, enquanto isso, o segundo cachorro já deverá ter entrado no bosque. O caçador vencedor será aquele que obtiver 50 moedas primeiro.

Cada cachorro leva 1 unidade de tempo para sair de um pote para outro, e 1 unidade de tempo para pegar as moedas de um pote, caso haja. 

Implementação

Crie 6 threads cachorro (2 amarelos, 2 verdes e 2 azuis) e use apenas um ExecutorService para limitar que apenas 3 threads Cachorro (um de cada cor) entre na classe Bosque. A classe Bosque deve conter os 20 potes, que podem ser implementados como um array de objetos Pote de tamanho 20.  O objeto Pote pode ter como atribudos quantidade de moedas, potes em que tem conexão, a referência das threads Cachorro que estão dormindo nele naquele momento, etc.

Existe várias formar de implementar a classe Bosque (p.ex. um método PegarMoedaNoPote_i para cada pote ou apenas um método PegarMoeda para todos potes, dentre outras soluções), discuta com o professor antes de implementar. Uma thread Cachorro ao invocar esse método consegue verificar se tem moedas para pegar, e pega se tiver. Se retornar zero, este cachorro deve dormir até ser interrompido  (use interrupt()) pelo cachorro Vermelho. Crie um método ColocarMoeda na classe Bosque para o Cachorro Vermelho colocar novas moedas nos potes que estiverem vazios. 

Toda vez que um cachorro encontrar um pode vazio ele deve dormir neste pote por 60 unidades de tempo (sleep(60 unidades de tempo)). O acesso ao pote é exclusivo, ou seja, não pode haver, em um mesmo instante, mais de um cachorro em um pote. No entanto, pode haver mais de um cachorro se estes estiverem todos dormindo, devido ao pote estar vazio. Neste trabalho, vocês não podem utilizar os mecanismos de controle de concorrência do Java (Monitores, Locks ou Semaforos).

A thread Cachorro Vermelho, a cada 2 unidades de tempo, deve verificar quais potes estão vazios e, para esses, colocar uma moeda. Após colocar a moeda, o cachorro Vermelho deve verificar se existe algum cachorro dormindo neste pote. Caso haja(m), ele deve chamar o método interrupt para interromper o sono deste(s) cachorro(s). Os cachorros, ao tiverem o sono interrompido, devem tentar pegar a única moeda do pote. Como somente um deve conseguir, os outros (se houver) devem dormir novamente mais 3 unidades de tempo.

O cachorro Vermelho salva-vida deve ser implementado usando ScheduledExecutorService, a cada intervalo de 2 unidades de tempo essa thread deve ser lançada para cumprir sua missão de colocar moedas nos potes vazios. 

Cada thread Cachorro deve ter uma variável local int (ver ThreadLocal na transparência de aula) indicando a quantidade de moeda coletada até o presente momento. Quando esse valor for igual a 20 o cachorro deve retornar ao dono para entregar as moedas. O programa deve imprimir a dupla de cachorros vencedora juntamente com as duplas segunda e terceira colocada indicando a quantidade de moedas coletadas.

Utilize o sleep() para simular cada atividade (saltos, pegar moeda, etc.). Uma unidade de tempo pode ser 100 milisegundos.

Antes de partir para implementação do código façam a modelagem do sistema para que tenham certeza do que vocês estão fazendo. Fica mais claro para o professor ver a modelagem de vocês e depois analisar a implementação. Mostrem que vocês são bons engenheiros de software !

Apresentação

Esse trabalho vale 2,5 pontos.

A atividade pode ser desenvolvida dupla. Em caso de cópia do código de outro aluno, ambos terão nota igual a zero.

O programa deverá ser apresentado ao professor no laboratório até o dia 08/09. Será verificado o funcionamento do programa e em seguida os alunos devem responder a questões sobre a forma como foram utilizados as threads e os escalonadores no programa. Trabalho não entregue no prazo terá 0,5 ponto descontado por semana de atrasoApós duas semanas de atraso o trabalho não será mais aceito.

Dúvidas

Atendimento aos Alunos

  • Horário: Quartas-feiras das 16:00 às 18:00.
  • Local: Prédio do INE - Sala 305.

E-Mail

l a u . l u n g @  i n f . u f s c . b r (turma A)

Mantida por Lau Cheuk Lung. Atualizada em 26/08/2015.

© Lau Cheuk Lung 2014