Précédent   Forum des professionnels en informatique > Java > Général Java > Langage
Langage Forum d'entraide sur le langage Java et autres langages pour la JVM : syntaxe, POO, conventions, API standard. Avant de poster -> FAQ Java
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 27/01/2012, 12h44   #1
Nouveau Membre du Club
 
Inscription : juillet 2008
Messages : 61
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 61
Points : 27
Points : 27
Par défaut Transformation boucle while en action multi-thread

Bonjour,

je dois parcourir une collection pour créer un ArrayList avec chacun des éléments de la collection, en effectuant quelques opérations sur ces éléments.

Les opérations sont longues.

Je voudrais exécuter chaque item de la boucle en parallèle.

Ainsi pour chaque col.next je voudrais lancer un nouveau thread qui retourne le résultat et permet de l'ajouter à l'ArrayList.

La méthode se terminerait lorsque toute la collection a été parsée.

Existe-t-il un pattern permettant d'effectuer cet amélioration?

Mon code ressemble donc à cela:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
 
ArrayList al = ...;
 
while (col.next()) {
      String a = col.getString("a");
      int b = col.getInteger("b");
      String c = doSomething(a, b);
 
      al.add(dsr);
 
}
 
return al;
Comment faire pour que chaque item de la boucle soit effectué par un thread différent, et pour que la liste soit bien remplie à la fin?
Pedro4 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2012, 14h44   #2
Modérateur
 
Homme Mathieu
Ingénieur développement logiciels
Inscription : avril 2004
Messages : 846
Détails du profil
Informations personnelles :
Nom : Homme Mathieu
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : avril 2004
Messages : 846
Points : 1 145
Points : 1 145
C'est quoi la variable "dsr" ? Elle est crée à quel moment ?
Mathieu.J est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2012, 10h23   #3
Modérateur
 
Avatar de tchize_
 
Homme
Responsable de service informatique
Inscription : avril 2007
Messages : 16 199
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 32
Localisation : Belgique

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Service public

Informations forums :
Inscription : avril 2007
Messages : 16 199
Points : 25 348
Points : 25 348
Envoyer un message via MSN à tchize_ Envoyer un message via Skype™ à tchize_
A supposer qu'il soit pertinent de paralléliser:

Enrober le code de calcul dans une classe X qui étends Runnable

Créer avant la boucle un ThreadPoolExecutor de taille donnée (à déterminer).

Pour chaque row rencontré, ajouter une nouvelle instance de X à l'executor (méthode execute)

après la boucle, attendre que l'executor aie fini le travail.
__________________
⥀⥁ Чиз faq java, cours java, javadoc. Pensez à et
"Votre génitrice tute des pédoncules au pandémonium" (le conjurateur, 1973)
tchize_ est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 31/01/2012, 11h14   #4
Nouveau Membre du Club
 
Inscription : juillet 2008
Messages : 61
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 61
Points : 27
Points : 27
Citation:
Envoyé par Mathieu.J Voir le message
C'est quoi la variable "dsr" ? Elle est crée à quel moment ?
Je me suis trompé en adaptant mon code. La variable dsr ici est la String c.
Pedro4 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2012, 11h16   #5
Nouveau Membre du Club
 
Inscription : juillet 2008
Messages : 61
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 61
Points : 27
Points : 27
Citation:
Envoyé par tchize_ Voir le message
A supposer qu'il soit pertinent de paralléliser:

Enrober le code de calcul dans une classe X qui étends Runnable

Créer avant la boucle un ThreadPoolExecutor de taille donnée (à déterminer).

Pour chaque row rencontré, ajouter une nouvelle instance de X à l'executor (méthode execute)

après la boucle, attendre que l'executor aie fini le travail.
Merci,

effectivement c'est la logique des threads.
Je ne suis pas sûr qu'il soit pertinent de paralléliser. Peut-être que je vais laisser cela pour le moment et revenir dessus quand j'aurai plus d'information.
Je m'attendais à trouver un petit pattern, mais en fait ma question est tellement générale que je ne crois pas qu'il en existe de si générique.
Pedro4 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2012, 12h04   #6
Nouveau Membre du Club
 
Inscription : juillet 2008
Messages : 61
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 61
Points : 27
Points : 27
Par défaut clôture de la question

bon, comme dit ci-dessous, il faut tout d'abord vérifier si c'est pertinent de sérialiser... et malheureusement je n'arrive pas à déterminer cela pour le moment (surtout par manque de temps de réflexion en fait).
Ayant pu grandement optimiser ma boucle par ailleurs, je ne vais pas utiliser les threads pour le moment.

Je passe quand même la question à résolue car l'architecture demandée est en fait expliquée dans tous les tutoriels sur les threads, et il s'avère que ma question était donc mal posée.

Merci!
Pedro4 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h56.


 
 
 
 
Partenaires

Hébergement Web