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

Concurrence et multi-thread Java Discussion :

[Thread] Travail en parallèle et attente


Sujet :

Concurrence et multi-thread Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de Jabbal'H
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2004
    Messages
    403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

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

    Informations forums :
    Inscription : Octobre 2004
    Messages : 403
    Par défaut [Thread] Travail en parallèle et attente
    Bonjour,
    Je me posais une question, et je ne sais pas vraiment comment le faire, ou plutôt comment bien le faire, je vous explique donc mon problème.

    J'ai un traitement, une fois que celui ci est finit, je dois en lancer 4 en parallèle, et attendre que les 4 soient terminé pour lancer un autre traitement, dans ces traitement je suis susceptible de mettre également à jour l'interface graphique, qui est en swing.

    Je me demandais donc comment faire cela proprement.

    Merci d'avance pour votre aide
    Nicolas,

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2006
    Messages : 80
    Par défaut
    Hello,

    Pour la première attente, tu peux utilise la méthode join() de la classe Thread, qui attend que la méthode run soit terminée.

    Pour l'attente des 4 threads, tu peux utilise le système de barrière.

    Tu créé une barrière de X slot. (4 dans ce cas), quand tu lances tes traitements, tu met un flag a chaque slot.

    Et tu met un objet en attente sur la barrière. Cet objet lancera le(s) traitements une fois que les (4) traitements seront terminés.

    Ensuite tu attends que chaque thread te signale qu'il a finit, à ce signal tu change le flag.

    Une fois que la barrière a reçu tout les signaux (les 4), elle s'ouvre et ton traitement continue.

    Ou tu peux utiliser l'api concurrent de java 5, qui définit une classe CyclicBarrier je pense (qui est, je suppose, du même principe). Je n'ai jamais utilisé cette implémentation en revanche.
    Le faire toi même peut-être interessant si la barrière attends des signaux du réseaux.

    Voila, j'espère avoir pu t'aider

  3. #3
    Membre éprouvé
    Avatar de Deadpool
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    1 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1 312
    Par défaut
    Pour la mise à jour de ton interface graphique, il faut bien faire attention de la faire dans l'Event Dispatch Thread (le thread dédié de Swing) via le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SwingUtilities.invokeLater(
      new Runnable(){
             public void run(){
                        //ici le code qui met à jour ton interface graphique
             }
      }
    );

  4. #4
    Membre chevronné Avatar de Jabbal'H
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2004
    Messages
    403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

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

    Informations forums :
    Inscription : Octobre 2004
    Messages : 403
    Par défaut
    Merci beaucoup pour votre aide, l'objet CyclicBarrier me parait très interessant, cependant, j'ai trouvé également
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ExecutorService executor = Executors.newFixedThreadPool(liste.size());
    Qui permet de faire à priori la même chose, il possède une méthode invokeAll(..) qui permet de lancer et attendre la fin de thread, donc c'est ce que je cherchais.

    Par contre dans l'éxemple que j'ai trouvé sur ExecutorService, il passais en argument le nombre de processeur, qu'est ce que cela change, j'ai pour ma part passé le nombre de thread que j'allais lancer, est ce ainsi qu'il faut faire ?

  5. #5
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par Jabbal'H Voir le message
    Par contre dans l'éxemple que j'ai trouvé sur ExecutorService, il passais en argument le nombre de processeur, qu'est ce que cela change, j'ai pour ma part passé le nombre de thread que j'allais lancer, est ce ainsi qu'il faut faire ?
    Le fait d'utiliser un nombre de threads correspondant au nombre de processus permet d'optimiser les traitements, et d'éviter de créer un trop grand nombre de thread. En fait si tu as plus de threads que de processus, le travail en parallèle est "simuler" en donnant la main aux différents threads les un après les autres.

    Si le nombre de thread est trop important, cela peut provoquer une surcharge du système sans pour autant que cela se concrétise réellement par un gain de performance...

    Prenons un exemple : tu as 100 tâches à exécuter sur une architecture avec 2 processeurs :
    • Si tu utilises 2 threads les tâches vont bien se répartir sur les différents processeurs, et comme tu exécuteras tes tâches deux par deux ton temps de traitement va logiquement se diviser par deux.
    • Si tu utilises 100 threads le traitements ne sera pas plus rapide car bien que tu lances 100 tâches en parallèles, il n'y en as que deux qui s'exécuteront en même temps, et le système passera de l'un à l'autre un grand nombre de fois...


    Sans comptez que tu dois partager le temps processus avec les autres applications. Un très grand nombre de thread pourrait induire une forte consommation CPU inutilement et gêner les autres applications...

    Si tu as un petit nombre de tâche tu peux les exécuter toutes à la fois... sinon met toi un nombre de thread limite


    a++

    PS : Pour les traitements sur l'interface graphique, tu peux te baser sur les SwingWorker (qui peuvent être directement exécutés par les ExecutorService).

    PS2 : N'oublie pas d'arrêter le pool de thread via shutdown() lorsque tu n'en as plus besoin, sinon les threads resteront endormis mais bel et bien vivant !

  6. #6
    Membre chevronné Avatar de Jabbal'H
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2004
    Messages
    403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

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

    Informations forums :
    Inscription : Octobre 2004
    Messages : 403
    Par défaut
    Merci pour cette explication, je me suis fait avoir le premier coup avec le shutdown, j'ai vite compris

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

Discussions similaires

  1. [Multi-Thread] Mettre un msg d'attente lors d'un traitement long
    Par pepito62 dans le forum Composants VCL
    Réponses: 3
    Dernier message: 29/03/2013, 20h43
  2. Lancer un thread permanent en parallèle de mes servlets
    Par confus dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 12/08/2009, 11h46
  3. [MFC] Creation d'un thread pour un popup d'attente
    Par firejocker dans le forum MFC
    Réponses: 8
    Dernier message: 07/02/2006, 09h15
  4. Un thread de travail qui se termine et se libère tout seul
    Par bigquick dans le forum Threads & Processus
    Réponses: 15
    Dernier message: 24/06/2005, 13h58
  5. Réponses: 18
    Dernier message: 06/04/2005, 14h09

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