Uso do Java ThreadPool
Estou tentando escrever um rastreador da web multithread.
Minha classe de entrada principal possui o seguinte código:
ExecutorService exec = Executors.newFixedThreadPool(numberOfCrawlers);
while(true){
URL url = frontier.get();
if(url == null)
return;
exec.execute(new URLCrawler(this, url));
}
O URLCrawler busca a URL especificada, analisa os links de extrações HTML e agenda os links invisíveis de volta à fronteira.
Uma fronteira é uma fila de URLs não rastreados. O problema é como escrever o método get (). Se a fila estiver vazia, espere até que qualquer URLCrawlers termine e tente novamente. Ele deve retornar nulo somente quando a fila estiver vazia e não houver URLCrawler ativo no momento.
Minha primeira ideia foi usar um AtomicInteger para contar o número atual de URLCrawlers em funcionamento e um objeto auxiliar para chamadas notifyAll () / wait (). Cada rastreador na inicialização incrementa o número de URLCrawlers em funcionamento atuais e na saída o diminui e notifica o objeto que ele foi concluído.
Mas eu li que notify () / notifyAll () e wait () são métodos um tanto obsoletos para fazer a comunicação de threads.
O que devo usar nesse padrão de trabalho? É semelhante aos produtores M e N consumidores, a questão é como lidar com a satisfação dos produtores.