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 :

Problème avec les multi-threads


Sujet :

Java

  1. #1
    Membre actif
    Homme Profil pro
    Première S
    Inscrit en
    Juillet 2010
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France

    Informations professionnelles :
    Activité : Première S

    Informations forums :
    Inscription : Juillet 2010
    Messages : 266
    Points : 281
    Points
    281
    Par défaut Problème avec les multi-threads
    Bonjour à tous,
    voici mon pb :

    j'ai une boucle qui tourne très vite, et qui accomplit disons 30 000 itérations.
    à l'intérieur de ces boucles, il y a un traitement relativement long ( ~ 300 ms). Ce traitement, il peu sans problème être accompli en parrallèle.
    J'ai donc décidé de créer un pool de 100 Thread grace au Framework Executor.

    Voici un squelette du code :

    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
    class{
     
    String tmp2;
    // ...
    // ma methode
    Executor exec = Executors.newFiwedThreadPool(100);
    for(...){
      tmp2 = "variable qui change";
        exec.execute(new Runnable(){
          public void run(){
              String tmp = tmp2;
              // traitement de tmp ...
           }
       }
    }
    bon, le pb, c'est tmp2.
    cette variable change à chaque tour, et si je ne fait rien, les traitement qui ce déroulent dans les autres threads utiliserons la valeur actuelle de tmp2, et pas la bonne !

    et seul les 100 premiers traitement sont bon ...
    evidement, c'est parce que les valeurs n'ont pas été cloné ... car le clonage se trouve dans le traitement.
    mon pb est-il compréhensible ?

    et surtout ... voyez-vous une solutions ...
    on pourrait mettre un compteur qui stope la boucle après 100 tour et qui attends la fin des traitements ... mais ce n'est pas très simple à faire ...

    merci d'avance.

  2. #2
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Bonsoir,

    Si tu veux utiliser un String qui se change souvent, utilise un StringBuffer, et si tu veux que les deux threads utiliserons la même valeur, déclare le comme static.

    A+.

  3. #3
    Membre actif
    Homme Profil pro
    Première S
    Inscrit en
    Juillet 2010
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France

    Informations professionnelles :
    Activité : Première S

    Informations forums :
    Inscription : Juillet 2010
    Messages : 266
    Points : 281
    Points
    281
    Par défaut
    mm ... Tu veux dire faire un :

    static StringBufer = monString

    dans le thread de traitement ?
    dans ce cas il faut admetre que les attribut static sont cloné dès l'instanciation du Runnable ...
    je vais bien voir, je vais essayé.
    merci bien.

    EDIT

    pardon j'ai mal compris, je suppose que tu veux dire de changer tmp2 en un StringBuffer static ... j'essaye ...

  4. #4
    Membre actif
    Homme Profil pro
    Première S
    Inscrit en
    Juillet 2010
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France

    Informations professionnelles :
    Activité : Première S

    Informations forums :
    Inscription : Juillet 2010
    Messages : 266
    Points : 281
    Points
    281
    Par défaut
    génial merci beaucoup !
    c'est bon à savoir cette astuce ...
    merci beaucoup.

  5. #5
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    Pour info, ton probleme ne concerne pas le clonage (dans ton code, tu ne clone rien). Ceci dit, tmp2 est utilisé par plusieurs threads. Il faut donc etre sur que son contenu soit bon à chaque utilisation (car si 1 thread le modifie, un autre lira la valeur modifiée). Pour cela, tu as le mot clé Java "synchronized" qui permet de s'assurer que certains bouts de code ne soient pas interompus par un autre thread. Voir les tutos sur le sujet. Google saura t'orienter en recherchant "synchronisation java"

    a+

  6. #6
    Membre actif
    Homme Profil pro
    Première S
    Inscrit en
    Juillet 2010
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France

    Informations professionnelles :
    Activité : Première S

    Informations forums :
    Inscription : Juillet 2010
    Messages : 266
    Points : 281
    Points
    281
    Par défaut
    oui, j'avais essayé avec synchronized ... mais ça n'a pas marché, sans doute parce que je m'y suis mal pris ...

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

Discussions similaires

  1. Problème avec le multi-threading
    Par mikeycast dans le forum C#
    Réponses: 23
    Dernier message: 18/09/2012, 18h01
  2. problèmes avec les threads
    Par lukbutor dans le forum C
    Réponses: 7
    Dernier message: 03/05/2007, 00h15
  3. Problèmes avec les thread et les pointeurs
    Par raspac dans le forum POSIX
    Réponses: 2
    Dernier message: 22/10/2006, 17h35
  4. [BOOST] Problème avec les threads
    Par SOAD08 dans le forum Dev-C++
    Réponses: 7
    Dernier message: 08/10/2006, 10h23
  5. Réponses: 5
    Dernier message: 10/05/2005, 10h22

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