Faire attendre un thread sur tous les autres différents

Flitzouille Messages postés 4 Date d'inscription lundi 3 avril 2006 Statut Membre Dernière intervention 7 avril 2006 - 3 avril 2006 à 21:51
cs_clemenza Messages postés 1 Date d'inscription lundi 24 avril 2006 Statut Membre Dernière intervention 24 avril 2006 - 24 avril 2006 à 21:21
Salut à tous

je suis en train de programmer une application en Java et j'ai besoin des threads. J'en ai déjà eu besoin auparavant mais ici j'ai un petit problème de conception, je ne vois pas trop comment m'y prendre. Quand je parle de conception c'est quels outils de Java utiliser, c'est comment organiser mon appli. Une fois l'outil désigné il n'y a pas de problème.

Voici donc ce que j'essaie de faire. Je possède un vecteur d'objets, tous les mêmes. J'aimerais lancer un thread pour chacun de ces objets. Le thread de chaque objet doit alors réaliser certaines opérations et compléter les informations dans les champs de son objets. Soit X le nombre de thread (et donc d'objets dans le vecteur). J'aimerais qu'une fois que les X threads ont fini de bosser, càd que toutes les infos sont stockées dans le vecteur (tous les champs des objets sont remplis), qu'un autre thread complètement différent (ou même le thread qui a lancé tous les X autres) soit réveillé. Ce thread devra alors compléter une base de données avec les infos recueillies par les X autres threads.

Je viens de chercher sur le net et j'ai effectivement trouvé pas mal de chose. Cependant, il ne s'agit pas du tout d'un problème de gestion de données partagées puisque chaque thread a son propre objet. J'aimerais faire attendre le thread de la base de données tant que le vecteur n'est pas complet. Si je n'avais que deux threads j'aurais pu jouer avec synchronized ou notify mais là j'en ai tout un groupe et un différent.

Je suis tombé sur la méthode "join()" pour faire attendre la fin d'un thread mais je me vois mal faire un truc du genre

T1.join();
T2.join();
....
T100.join();

pour faire attendre mon thread BD sur tous les autres.

Comme je vous l'ai dit, ce n'est pas l'implémentation même qui pose problème mais plutôt l'outils, méthodes, ... à utiliser. Je suis aussi tombé sur des "groupes" de threads, pensez-vous que ce soit une bonne idée.

Je recherche la rapidité et l'efficacité avec consommation min de mémoire et CPU (donc boucle infinie on oublie ;-)).

Auriez-vous des conseils ou idées ?

Merci d'avance.

4 réponses

bloofi Messages postés 388 Date d'inscription mercredi 1 octobre 2003 Statut Membre Dernière intervention 3 mai 2006 2
4 avril 2006 à 00:19
coucou,

j'ai un truc a te proposer mais tu va peut etre pas aimer ^^.

- dans ta classe lanceuse de thread, tu declare un compteur en lui foutant comme valeur le nombre de thread lancés
- chaque thread lancé appele, quand il est fini, une methode (dans la classe qui lance tous les threads) qui decremente le compteur
- dans cette meme méthode si le compteur est egal a 0, tous les threads sont finis donc tu peut executer le thread final

j'espere que j'ai ete clair (et que j'ai pas dit trop de connerie ^^)
0
cs_valckar Messages postés 34 Date d'inscription jeudi 16 mars 2006 Statut Membre Dernière intervention 30 juin 2006
4 avril 2006 à 09:18
Bonjour



Je te propose la classe Semaphore.

Tu crés un Semaphore avec un permite = taille du vecteur,

Chaque Thread lance fait un aquire sur ce semaphore puis un release à la fin

Le thread de base, aprés avoir lancé tous les Threads fait un acquireUninterruptibly(taille).

A tester tien moi au courant.



A+
0
Flitzouille Messages postés 4 Date d'inscription lundi 3 avril 2006 Statut Membre Dernière intervention 7 avril 2006
4 avril 2006 à 11:27
Bonjour,

merci de vos réponses. J'ai trouvé mon bonheur dans les nouvelles possibilités qu'offre la version 1.5. J'ai utilisé les lockets et executor.

http://lroux.developpez.com/article/java/tiger/?page=page_3#Lconcurrence
0
cs_clemenza Messages postés 1 Date d'inscription lundi 24 avril 2006 Statut Membre Dernière intervention 24 avril 2006
24 avril 2006 à 21:21
salut
ds plusieurs docs oou livres on lit que join bloque le thread alors qu'elle ne bloque que le prog principal donc je te propose d'utiliser synchronized()
tu peux synchroniser la méthode ou les thread..
j'espère que c utile
0
Rejoignez-nous