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 :

Synchroniser correctement deux threads


Sujet :

Java

  1. #1
    Membre très actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2012
    Messages : 324
    Par défaut Synchroniser correctement deux threads
    Bonjour,

    J'ai une classe Java qui exécute un certain nombre de threads (peu importe l'ordre de l'exécution) et chacun de ces threads génère un fichiers texte.

    A la suite de l'exécution, j'aimerais concaténer tous ces fichiers. Le problème est que parfois le thread responsable de la concaténation effectue cette opération alors que les fichiers ne sont pas encore remplis. J'aimerais faire en sorte que cette opération ne soit réalisée que si tous mes threads ont fini de générer les fichiers.

    Avec la methode sleep() ça fonctionne mais je souhaiterais le faire avec wait et notify (car je ne veux pas préciser le temps à attendre), sauf que ça ne fonctionne pas. J'ai un wait infini et je ne comprend pas pourquoi.

    Quelqu'un saurait-il m'indiquer comment faire ?

    Merci d'avance pour votre aide.

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Bonjour,

    En l'occurrence il faut attendre qu'ils aient tous fini avant de continuer, donc il vaudrait mieux simplement utiliser join(), au lieu de wait() ou notify().
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    Il faudrait savoir comment tu crées tes threads. Mais regarde du coté de la classe ThreadPoolExecutor qui permet de gérer un pool de threads et qui permet d'attendre leur fin d'execution.

  4. #4
    Membre très actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2012
    Messages : 324
    Par défaut
    et comment je pourrais utiliser cette methode join()?? j'ai essayé de la mettre dans le corps de chque thread mais ca ne fonctionne pas j'ai une sorte d'attente infinie une fois encore.
    si quelqu'un pourrais me dire comment poster un code java ici parque j'aimerai bien vous montrer la classe peut être ca sera plus facile a detecter le probleme.

    merci pour toutes vos reponses

  5. #5
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 096
    Par défaut
    Un join dans le corps des thread ?

    Je pense qu'une petite lecture de Tutorial ne fera pas de mal.
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre très actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2012
    Messages : 324
    Par défaut
    merci bcp , je sais que c'est ridicule oui mais je n'ai jamais programmé des thread de ma vie. et mon probleme c'est que mes thread sont déclaré de manière anonyme
    new Thread() { blablabla}.start() donc je n'arrive pas a faire join() sur ce Thread voila

  7. #7
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    Tu as plusieurs manieres de faire les choses :
    - mettre les mains dans le cambouis et faire les joins qui vont bien (et qu'il faudra mettre à jour si tu ajoutes/supprime des threads), ce qui impose d'utiliser des variables pour la création des threads pour pouvoir faire un join.
    - Utiliser une classe dédiée qui fonctionne comme précisé dans mon message #3
    - Mettre en place une usine à gaz encore plus compliquée

    A toi de choisir

  8. #8
    Membre très actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2012
    Messages : 324
    Par défaut
    j'ai fait comme tu m'as dit et j'ai utilisé des classes dédiée à ça. j'ai mis la methode join() a la suite du thread qui DOIT être terminé pour lancer la suite. cependant ca ne marche toujours pas le fichier concaténé est vide.
    je t'ai mis le code de la classe en piece jointe puor que ca soit plus claire. STP dis moi ou est le probleme exactement

    mertci infiniment
    Fichiers attachés Fichiers attachés

  9. #9
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 096
    Par défaut
    Je vois que tu démarres ton thread pour l'attendre juste après, ce qui n'a aucun sens, autant ne pas mettre de thread.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     s.start();
        try {
            s.join(); // je fais le join
        } catch (InterruptedException ex) {
            Logger.getLogger(Bgp_Peers.class.getName()).log(Level.SEVERE, null, ex);
        }
    Est tu sure de vouloir/devoir utiliser des thread pour ce que tu veux faire ?

    Le problème est que "tu fais n'importe quoi" (en tout cas c'est l'impression que ton code donne a priori) et qu'il te manque une bonne partie théorique (sans vouloir être méchant hein),

    As tu lu le tutorial que j'ai mentionné, ainsi que d'autres, sur le sujet ?
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Membre très actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2012
    Messages : 324
    Par défaut
    la page me renvoi erreur not found je sais pas pk. j'ai lu plein de tuto mais je n'arrive pas a me concentrer car je suis limité par le tepmp (je suis en pfe) et je sais pas trop comment arriver a faire ca. je n'ai jamais fais du java avancé.

  11. #11
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 096
    Par défaut
    Lien corrigé
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  12. #12
    Membre très actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2012
    Messages : 324
    Par défaut
    merci bcp je vais le lire. j'ai au fait une autre question: est ce que c'est possible de mettre une condition sur le start() d'un thread. je me suis dis que je pourrais retartder l'exécution du thread "ConcatFile " jusqu'à ce que le thread précédent (ExecuteSnmp) passe à l'état "TERMINATED" ?????

  13. #13
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Bah c'est à ça que sert le join(), donc non, il n'y a pas d'autre manière directe de faire la même chose.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  14. #14
    Membre très actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2012
    Messages : 324
    Par défaut
    merci pour ton lien je viens de le lire. je crois cependant que la methode wait corresond mieux a mon probleme. j'ai essayé avec wait et notify cependant une fois en attente j n'arrive pas a relancer mon thread meme si j'ai suivi a la lettre le tuto, la synchronisation ect..
    bref je vais essayer encore merci

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/10/2013, 23h39
  2. Réponses: 1
    Dernier message: 23/03/2013, 22h21
  3. Synchronisation de deux threads.
    Par DakM dans le forum Threads & Processus
    Réponses: 7
    Dernier message: 19/11/2011, 14h50
  4. Réponses: 6
    Dernier message: 13/09/2010, 16h02
  5. synchronisation entre deux threads
    Par chabfive dans le forum Concurrence et multi-thread
    Réponses: 9
    Dernier message: 03/11/2006, 12h17

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