Java ThreadPool Nutzung

Ich versuche, einen Multithread-Webcrawler zu schreiben.

Meine Haupteintragsklasse hat den folgenden Code:

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

Der URLCrawler ruft die angegebene URL ab, analysiert die HTML-Extrakt-Links und plant unsichtbare Links zurück an die Grenze.

Eine Grenze ist eine Warteschlange von nicht gecrawlten URLs. Das Problem ist, wie die Methode get () geschrieben wird. Wenn die Warteschlange leer ist, sollte sie warten, bis alle URLCrawler fertig sind, und es dann erneut versuchen. Es sollte nur dann null zurückgeben, wenn die Warteschlange leer ist und derzeit kein URLCrawler aktiv ist.

Meine erste Idee war, eine AtomicInteger-Zahl zum Zählen der aktuellen Anzahl von URLCrawlern und ein Hilfsobjekt für notifyAll () / wait () -Aufrufe zu verwenden. Jeder Crawler erhöht beim Start die Anzahl der aktuell aktiven URLCrawler, dekrementiert sie beim Beenden und benachrichtigt das Objekt, dass er abgeschlossen wurde.

Aber ich habe gelesen, dass notify () / notifyAll () und wait () etwas veraltete Methoden für die Thread-Kommunikation sind.

Was soll ich in diesem Arbeitsmuster verwenden? Es ist ähnlich wie bei M Produzenten und N Konsumenten, die Frage ist, wie mit der Exaustion von Produzenten umgegangen werden sol

Antworten auf die Frage(12)

Ihre Antwort auf die Frage