2010-05-31 7 views
1

J'ai 2 piscines de filsComment terminer un thread dans Java?

ioThreads = (ThreadPoolExecutor)Executors.newCachedThreadPool(); 

cpuThreads = (ThreadPoolExecutor)Executors.newFixedThreadPool(numCpus); 

Je simple crawler web que je veux créer un iothread, passer une URL, il sera alors chercher l'URL et le contenu vers un cpuThread être traité et le ioThread va alors chercher une autre URL, etc ...

À un certain point, le thread IO n'aura pas de nouvelles pages à explorer et je veux mettre à jour ma base de données que cette session est terminée. Comment puis-je savoir quand les threads sont tous traités et que le programme peut être terminé?

Répondre

2

Une manière typique serait d'utiliser un ou plusieurs booléens communs (volatils ou synchronisés) pour communiquer entre les threads. Lorsque le thread IO est terminé, il retourne le drapeau. L'autre thread vérifie la valeur de l'indicateur dans une boucle et quand il voit la valeur modifiée, il quitte la boucle et se termine. Si vous utilisez le modèle producteur-consommateur avec une file d'attente de travail entre les threads d'E/S et les threads de traitement, une autre possibilité serait de passer un jeton spécial "fin de traitement" à la file d'attente, qui signalerait aux processeurs ils peuvent se terminer.

+0

Comment le thread se termine-t-il réellement? – James

+4

Juste 'return' de la méthode' run() '. – BalusC

+0

Assez inutile. L'autre thread pourrait juste appeler join() avec un timeout de 1 ms dans une boucle, pas besoin de booléens du tout. – EJP

0

Étalez la logique du programme. Stocker des URL dans un objet Stack (les piles sont thread-safe).

si

a. there are no more URLs on the stack 
b. no more crawler threads running 
c. no more CPU/processing threads running 

programme peut alors écrire à DB et la sortie.

Questions connexes