INE5645
Laboratório 3 - Semáforos

Prof. Lau Cheuk Lung

Departamento de Informática e Estatística
Universidade Federal de Santa Catarina
 

INE5645 | Descrição | Implementação | Apresentação | Dúvidas


Descrição

Nesta atividade de laboratório você deve implementar um programa em Java utilizando threads para localizar arquivos armazenados no disco rígido.

 

 

O programa deve permitir que o usuário especifique critérios a serem considerados na busca de arquivos, como nome, tipo (extensão), tamanho, data ou conteúdo (uma palavra ou frase contida no arquivo, por exemplo). Também deve ser especificado pelo usuário a partir de que ponto da árvore de diretórios será efetuada a busca (por exemplo, C:\, /usr/local, etc). A busca de arquivos deve ser efetuada no diretório especificado e também nos subdiretórios deste.


Implementação

O algoritmo de busca deve criar uma thread para cada novo subdiretório encontrado. Cada thread deve efetuar a busca dentro do subdiretório correspondente e listar todos os arquivos encontrados que satisfaçam os critérios de busca. As threads, na medida em que são criadas, são executadas concorrentemente com as outras, sem nenhum controle. Contabilize a quantidade de threads criada e o tempo de resposta para podermos comparar depois.

Na segunda parte do trabalho, o algoritmo de busca deve criar somente 12 threads mas, apenas 6 delas pode fazer o trabalho de busca concorrentemente. Utilize um Semáforo (java.util.concurrent.Semaphore) para garantir que apenas 6 threads trabalhem concorrentemente. Quando uma thread encontra um subdiretório no diretório em que está buscando, ela registra esta informação no objeto Task (invocando o método setTask(String path)). Quando uma thread termina de fazer uma busca em um diretório, ela sai do semáforo, invoca o método String getTask(), para obter uma nova tarefa de busca, e volta pra fila do semáforo. As threads só terminam (morrem) quando tiverem certeza que não haverá mais tarefas no objeto Task

Logos após sair do semáforo, o resultado da busca de uma thread deve ser inserido (usando o método put()) numa fila ArrayBlockingQueue<E> de tamanho 4. Implemente uma thread especial (chamada Print) para invocar continuamente o método take() para remover um resultado dessa fila, mostrar na tela e salvar em um arquivo (formato .txt). Como só tem uma thread Print é possível que se crie uma fila no método put() do objeto ArrayBlockingQueue<E>. Faça um teste usando SynchronousQueue<E>

Para implementar a busca, utilizar o pacote java.io.File.

Faça a busca (a partir de C:\) por arquivos com extensão .log e avalie os resultados dos dois testes (projetos) em relação ao uso de memória, processador e tempo de resposta. Verifique se há vantagem no uso de semáforo nessa aplicação.


Apresentação

A atividade deve ser desenvolvida individualmente. O programa deve ser apresentado ao professor no laboratório até o dia 14/10/13. Os trabalhos podem ser enviados por e-mail dentro dos prazos para posterior defesa a ser marcado com o professor. Será verificado o funcionamento do programa e em seguida o aluno deve responder a questões sobre a forma como foram implementados as threads e os semáforos no programa.

Trabalhos entregues com atraso terão desconto automático de 2 pontos por semana de atraso. 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. Em caso de cópia do código de outro aluno, ambos terão nota igual a zero.


Dúvidas

Atendimento aos Alunos

  • Horário: Terças-feiras das 16:00 às 17:40.
  • 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


Mantida por Lau Cheuk Lung. Atualizada em 26/09/2013.