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.

questionAnswers(6)

yourAnswerToTheQuestion