J'essaie d'écrire un robot d'indexation multithread.Utilisation de ThreadPool Java
Ma principale classe d'entrée a le code suivant:
ExecutorService exec = Executors.newFixedThreadPool(numberOfCrawlers);
while(true){
URL url = frontier.get();
if(url == null)
return;
exec.execute(new URLCrawler(this, url));
}
Le URLCrawler récupère l'URL spécifiée, analyse le code HTML extrait des liens de celui-ci, et les horaires des liens invisibles retour à la frontière.
Une frontière est une file d'URL non explorée. Le problème est de savoir comment écrire la méthode get(). Si la file d'attente est vide, attendez la fin de URLCrawlers, puis réessayez. Il devrait retourner null seulement quand la file d'attente est vide et il n'y a aucun URLCrawler actuellement actif.
Ma première idée était d'utiliser un AtomicInteger pour compter le nombre actuel de URLCrawlers en cours de travail et un objet auxiliaire pour les appels notifyAll()/wait(). Chaque moteur de balayage au démarrage incrémente le nombre de URLCrawlers en cours et, en fin de session, le décrémente et notifie l'objet qu'il a terminé.
Mais j'ai lu que notify()/notifyAll() et wait() sont des méthodes quelque peu obsolètes pour faire la communication de thread.
Que devrais-je utiliser dans ce modèle de travail? Il est similaire aux producteurs M et N consommateurs, la question est de savoir comment faire face à l'exaustion des producteurs.
Oui, c'est une solution pour un état stable. Mais comment traiter alors avec la situation quand aucun des URLCrawlers files d'attente des URLs? Avec une file d'attente bloquante, la frontière bloquera à l'infini. –
Dans ce cas, vous pouvez avoir une méthode crawlerDone() sur votre objet frontière qui est appelée chaque fois qu'un UrlCrawler a fini de fonctionner. Cette méthode avec l'approche de compteur que vous avez suggérée, vous pouvez tester (dans votre méthode de frontière) si tous les robots ont fini. Si cela est vrai, get() peut retourner null sans bloquer – naikus
frontier peut être une file d'attente de blocage de capacité fixe. Un bon candidat pour cette capacité est le numberOfCrawlers –