Mecanismo de Semáforo do Java
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.
Para fazer a busca de arquivos busque no Google exemplos de código, tal como nesse link.
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 10 threads mas, apenas 5 delas pode fazer o trabalho de busca concorrentemente. Utilize um Semáforo (java.util.concurrent. Semaphore) para garantir que apenas 5 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 5. 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
Como o trabalho anterior, esse trabalho também vale 2,5 pontos.
A atividade pode ser desenvolvida individualmente ou em dupla. Em caso de cópia do código de outro aluno, ambos terão nota igual a zero.
O programa deverá ser enviado ao Moodle e apresentado ao professor no laboratório até o dia 26/11. Será verificado o funcionamento do programa e em seguida os alunos devem responder a questões sobre a forma como foram utilizados threads e locks no programa. Trabalho não entregue no prazo terá 0,5 ponto descontado por semana de atraso. Apó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 17:40.
- Local: Prédio do INE - Sala 305.
l a u . l u n g @ i n f . u f s c . b r
Mantida por Lau Cheuk Lung. Atualizada em 08/11/2015.