IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Threads dans un for


Sujet :

Java

  1. #1
    Membre du Club
    Profil pro
    Développeur Full Stack
    Inscrit en
    Mars 2009
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Full Stack

    Informations forums :
    Inscription : Mars 2009
    Messages : 94
    Points : 69
    Points
    69
    Par défaut Threads dans un for
    Bonjour,

    Afin d’accélérer mon application, je souhaite utiliser des threads sur des opérations distinctes mais qui prennent un certain temps. Cependant, je ne sais pas comment implémenter une gestion de threads dans mon cas actuel.

    Mon code ressemble à cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    private List<Map> maFonction(Collection<myObject> params) throws SQLException{
            List<Map> maps = new ArrayList<Map>();
     
            for (myObject o : params) {
                /**
                 * bindMyObject() prend un temps significatif
                 */
                maps.add(Processor.bindMyObject(o));
            }
     
            return maps;
        }
    Dans mon cas, chaque appelle à bindMyObject() prend un temps relativement long. Ce temps est nécessaire et compréhensible, mais chaque appel à la fonction est bien détaché et pourrait très bien s'exécuter en parallèle.

    Mais là où cela me pose un soucis, c'est que le retour de bindMyObject doit être stocké dans ma variable maps, qui une fois remplie est retourné.

    Sans valeur de retour de la part de bindMyObject(), je ferais un extends Threads sur la class Processor puis je lancerai mes threads à la suite. Avec join() j'aurai attendu (entre ma boucle for et mon return) que chaque thread termine bien son execution et je pense que cela aurait été bon.

    Mais ici avec une valeur de retour je ne sais pas vraiment comment faire. Pourriez-vous me guider sur cette question ?

    Merci

  2. #2
    Membre régulier

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2011
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2011
    Messages : 37
    Points : 89
    Points
    89
    Par défaut
    Tu peux regarder du côté du framework Executor et des Future<V> dans les cours et tutoriels java : http://java.developpez.com/cours/

  3. #3
    Membre du Club
    Profil pro
    Développeur Full Stack
    Inscrit en
    Mars 2009
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Full Stack

    Informations forums :
    Inscription : Mars 2009
    Messages : 94
    Points : 69
    Points
    69
    Par défaut
    Bonjour,

    Merci, en effet le framework Executor semble être le plus indiqué. Cependant j'ai un petit soucis sur la manière d'implémenter cela.

    Avec le framework Executor, on dispose de l'instruction du CompletionService et de son instruction take(). Mais cette instruction nécessite de connaitre par avance le nombre de retour attendus. Sauf que le nombre d'objets dans ma Collection params n'est pas fixe, je peux avoir 10 threads à faire comme 50 selon le nombre d'objets dans params.

    Comment exécuter les Processor.bindMyObject(o) en parallèle (threads), gérer les retour en les intégrant au fur et à mesure dans ma map et faire mon return de ma map une fois tous les retours de threads récupérés et insérés dans celle-ci ?

    Merci

  4. #4
    Membre éclairé Avatar de JoeChip
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    536
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 536
    Points : 803
    Points
    803
    Par défaut
    Peut-être en ajoutant un thread qui s'occupe de tout ça ? genre il lance les threads, attend qu'ils soient tous revenus, puis fait la map et la renvoie...?

  5. #5
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    Tu lance ton executorservice. Ensuite dans ta boucle, tu crée tes future, tu les stockes dans une list et tu les ajoute au fur et à mesure au service.
    Après la fin de la boucle, tu attends la fin du service. Ensuite tu passe sur chaque future pour récupérer son résultat et tu les ajoute au fur et à mesure dans la map, tout simplement.

  6. #6
    Membre du Club
    Profil pro
    Développeur Full Stack
    Inscrit en
    Mars 2009
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Full Stack

    Informations forums :
    Inscription : Mars 2009
    Messages : 94
    Points : 69
    Points
    69
    Par défaut
    Bonjour,

    Désolé pour ma réponse tardive.

    @tchize_ : cette solution me semble la plus adaptée avec l'utilisation du framework Executor. Je vais implémenter celle-la.

    Merci

  7. #7
    Nouveau membre du Club
    Inscrit en
    Janvier 2009
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 46
    Points : 25
    Points
    25
    Par défaut
    Ou sinon :

    Tu crée une classe ProcessorThead :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    public class ProcessorThread implements Runnable{
       private List<Map> maps;
       private MyObject ojb;
     
       public ProcessorThread(List<Map> maps, MyObject obj){
            this.maps = maps;
            this.ojb = ojb;
       }
     
       public void run(){
             Map res = Processor.bindMyObject(ojb);
             synchronized(maps){
                   maps.add(res);
             }
       }
    }
    Et dans ta classe principale :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    private List<Map> maFonction(Collection<myObject> params) throws SQLException{
            List<Map> maps = new ArrayList<Map>();
            List<Thread> threads = new ArrayList<Thread>();
     
     
            for (myObject o : params) {
                 // Création des threads
                 ProcessorThread pt = new ProcessorThread(o);
                 Thread th = new Thread(pt);
                 threads.add(th);
                 th.start();
            }
     
            // Attente que tous les threads soient terminées
            boolean ended = true;
            do{
                ended  = true;
                for(Iterator<Thread> it = threads.iterator(); it.hasNext();){
                     Thread th = it.next();
                     if(th.isAlive()){
                          Thread.sleep(100);
                          ended  = false;
                          break;
                     }
                }
            }while(! ended); 
     
            return maps;
        }
    La classe ProcessorThread sera le thread qui devra exécuter ton traitement.
    La fonction maFonction est en deux parties :
    1 - On crée et on démarre les threads (en les stockant dans une liste)
    2 - On crée une boucle qui tourne a interval régulier, et termine uniquement quand tous les threads ont terminés leur exécution

  8. #8
    Membre éclairé Avatar de JoeChip
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    536
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 536
    Points : 803
    Points
    803
    Par défaut
    Peut-être en ajoutant un thread qui s'occupe de tout ça ? genre il lance les threads, attend qu'ils soient tous revenus, puis fait la map et la renvoie...?
    Euh -1 pourquoi là ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. 3 Thread dans une boucle for
    Par Etudiante_Ines dans le forum Général Java
    Réponses: 27
    Dernier message: 16/03/2012, 21h57
  2. des Thread dans un boucle FOR
    Par Etudiante_Ines dans le forum Général Java
    Réponses: 4
    Dernier message: 15/03/2012, 12h40
  3. [Serveur J2EE] Faire tourner un thread dans un serveur d'applications
    Par Pierre-Yves VAROUX dans le forum Java EE
    Réponses: 3
    Dernier message: 13/10/2005, 14h10
  4. création de plusieurs threads dans WinMain
    Par ChidoriRasengan dans le forum DirectX
    Réponses: 1
    Dernier message: 15/06/2005, 21h36
  5. Thread dans une classe ?
    Par Sephi dans le forum Threads & Processus
    Réponses: 7
    Dernier message: 07/03/2004, 18h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo