LABORATÓRIO 3:  SEMÁFOROS

INE5645 | Descrição | Implementação | Apresentação


Descrição

Nesta atividade de laboratório você deve simular uma competição de threads jogando o jogo tesoura, papel e martelo. Existem dois times de jogadores (verde e azul) com 90 threads Jogador cada - todas devem ser criadas no início do programa. Em cada rodada, três jogadores de cada time entra na região critica e escrevem sua escolha (tesoura, martelo ou papel) num array de tamanho dois (0 para o jogador verde e 1 para o jogador azul). Existe uma thread Juiz que lê cada desses arrays para verificar se houve vencedor. Caso não haja, esses dois jogadores continuam jogam. Caso contrário, os dois jogadores ficam em espera do resultado dos outros jogos naquela rodada. Ao final da rodada, o Juiz verifica o resultado final daquela rodada (ex. 2x1, 3x0, 1x2 ou 0x3). Os três jogadores perdedores devem terminar sua execução e os vencedores voltam para o início da fila para entrar de novo no jogo.

 

O jogo termina quando um dos times não tiver mais jogadores. No fim, o programa deve imprimir a quantidade de rodadas que cada time venceu e o resultado de cada rodada - o juiz pode fazer esta contabilização.


Implementação

Crie 90 threads para cada time usando o Executor. Você deve encontrar uma forma para que entre 3 jogadores de cada time na sala de jogo (um semáforo de tamanho 6). Você deve utilizar Wait/Notify ou Await/Signal para qualquer situação em que a thread Jogador deve esperar (wait), por exemplo, esperar até que tenha 3 parceiros para entrar na região crítica ou esperar pelo resultado do juiz (saber se foi vencedor do jogo e, também, se foi vencedor da rodada). Outro caso seria um jogador escrever sua escolha no array e chamar wait (ou await) até que o juiz o acorde (notify ou signal) para saber se joga de novo ou espera (wait ou await) pela decisão da rodada.

Para que o Juiz não leia enquanto tiver jogador escrevendo no array, este deve ser implementado usando AtomicIntegerArray de duas posições.

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

A atividade deve ser desenvolvida em duplas. O programa deve ser apresentado ao professor no laboratório até o dia 04/05. Os dois componentes do grupo devem estar presentes. Será verificado o funcionamento do programa e em seguida os alunos devem responder a questões sobre a forma como foram utilizados threads e semáforos no programa.

Trabalhos entregues com atraso terão desconto automático de 2 pontos. Após a segunda semana (14 dias após o fim do prazo original), o trabalho não mais será aceito, ou seja, terá nota zero.

Podem ser atribuídas notas diferentes aos alunos de um grupo, dependendo das respostas às perguntas sobre o código do programa efetuadas pelo professor. Caso um dos alunos não esteja presente ou demonstre não conhecer o código do programa, será atribuída nota zero à atividade. Em caso de cópia do código de outro grupo, ambos terão nota igual a zero.