Использование Java ThreadPool

Я пытаюсь написать многопоточный веб-сканер.

Мой основной входной класс имеет следующий код:

ExecutorService exec = Executors.newFixedThreadPool(numberOfCrawlers);
while(true){
    URL url = frontier.get();
    if(url == null)
         return;
exec.execute(new URLCrawler(this, url));
}

URLCrawler извлекает указанный URL, анализирует HTML, извлекает из него ссылки и планирует невидимые ссылки обратно к границе.

Граница - это очередь неисследованных URL-адресов. Проблема в том, как написать метод get (). Если очередь пуста, она должна дождаться окончания работы любых URLCrawlers, а затем повторить попытку. Он должен возвращать ноль только тогда, когда очередь пуста, и в настоящее время нет активного URLCrawler.

Моей первой идеей было использовать AtomicInteger для подсчета текущего количества работающих URLCrawlers и вспомогательный объект для вызовов notifyAll () / wait (). Каждый сканер при запуске увеличивает количество текущих рабочих URLCrawlers, а при выходе уменьшает его и уведомляет объект, который он завершил.

Но я читал, что notify () / notifyAll () и wait () несколько устарели для связи между потоками.

Что я должен использовать в этой схеме работы? Это похоже на M производителей и N потребителей, вопрос в том, как бороться с истощением производителей.

Ответы на вопрос(6)

Ваш ответ на вопрос