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.
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.
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.