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 :

[Threads] Synchronisation


Sujet :

Concurrence et multi-thread Java

  1. #1
    Membre averti
    Inscrit en
    Décembre 2005
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 30
    Par défaut [Threads] Synchronisation
    Bonjour,
    J'ai un probleme de synchronisation de thread.
    J'ai donc une class qui herite de thread.

    cette classe possede
    -une methode synchronized demandeImage().
    -une methode run:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public void run() {
            CamClass uneCam = (CamClass)mcc.vCam.getID(this.idCam);
            while(uneCam.getEnLecture()) {
                demandeImage();
                try {
                    this.sleep(100);
                } catch(Exception e) {
                    System.err.println("Impossible d'effectuer le sleep");
                }
     
            }
            System.out.println("Arret du thread");
        }
    Vous l'aurez compris, tant que le thread est vivant, je fais une demande d'image, et ensuite je sleep 100ms.

    C'est là que ça se complique. dans la methode demandeImage, j'envoie et recupere des données a partir d'une flux (InputStream et OutputStream).
    Si je lance un seul thread, pas de probleme. Si j'en lance 2 ou + les thread font des demandeImages(), simultanement. De ce fait il récupere des octets qui ne leurs sont pas déstiné etc etc...

    Je voudrais donc savoir comment faire pour que, quand un thread appelle la methode demandeImage, tous les autres threads attendent, une fois demandeImage terminé, le thread se met en wait, et permet a un autre thread d'appeler demandeImage()... etc etc.

    J'ai essayé avec notifyAll() et wait(), mais je ne suis arrivé a rien...

    Merci de vos lumieres

  2. #2
    ego
    ego est déconnecté
    Rédacteur

    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    1 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 883
    Billets dans le blog
    2
    Par défaut
    Il faut en fait synchronizer les threads sur une même ressource.
    Le synchronized évite que la même opération d'un objet soit appelée de manière concurrentielle mais cela n'évite pas, si tu exécutes plusieurs objets d'appeler la même opération sur ces instances !
    En fait, dans ton cas, la ressource critique étant visiblement ton stream, tu ne le protèges pas en faisant ce que tu fais actuellement.

    Tu peux donc, dans ta méthode demandeImage faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    synchronized (MaClasse.class) {
       <appel à ton stream ici>
    }
    MaClasse étant le nom de la classe de l'objet qui a l'opération demandeImage.
    Tu peut remplacer aussi le "MaClasse.class" par l'objet représentant ton stream si la référence est la même pour tous les threads que tu lances.

    Tu peux aussi regarder le pattern "Guard" et si tu utilises le JDK1.5, le package java.util.concurrent

  3. #3
    Membre chevronné Avatar de Scorpyosis
    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2004
    Messages : 365
    Par défaut
    tu peux commencer par declarer ta methode demandeImage() en synchronized, comme ca chaque Thread fera l'un après l'autre l'appel a cette méthode.

    Ceci te permettra de ne pas avoir d'octets allant au mauvais Thread, par contre ca ne garantira pas surtout si tu as beaucoup de Thread qu'ils se partageront equitablement la ressource, par exemple si tu as 3 thread tu peux avoir un comportement du type :

    t1 marche - t2,t3 attendent
    t1 a fini
    t2 marche - t1,t3 attendent
    t2 a fini
    t1 marche - t2,t3 attendent
    ....

  4. #4
    Membre averti
    Inscrit en
    Décembre 2005
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 30
    Par défaut
    Je ne suis pas sur d'avoir bien compris.

    Dans le constructeur de mon thread, je lui file le socket en parametre sur lequel j'effectue les echanges.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    //flux d'ecriture
                this.fluxSortie = new DataOutputStream(new BufferedOutputStream(sck.getOutputStream()));
     
                //flux de lecture
                this.fluxEntree = new DataInputStream(new BufferedInputStream(sck.getInputStream()));
    sck étant le socket passé en parametre.

    Il faudrait donc qu'a l'interieur de ma méthode demandeImage() je fasse
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    synchronized (this.fluxEntree, this.fluxSortie) {
       < Et ici je fait tout mon traitement 
       comme this.fluxEntree.read() etc etc > ???
    }
    Pour Scorpyosis, m'a méthode demandeImage est deja déclaré synchronized mais ils appelle pourtant la méthode en même temps.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public synchronized void demandeImage() {
    [/quote]

  5. #5
    ego
    ego est déconnecté
    Rédacteur

    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    1 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 883
    Billets dans le blog
    2
    Par défaut
    Comme je ne savais pas exactement comme tu lisais...
    La solution est donc de se synchronizer sur l'objet "class"
    Ex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class MonDemandeurImage {
     
        public MonDemandeurImage (Socket sck) {
              ....
        }
     
        public void demandeImage() {
             synchronized(this.getClass()) {
                    .... manipulation de test streams......
             }
        }
    }

  6. #6
    Membre averti
    Inscrit en
    Décembre 2005
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 30
    Par défaut
    Un grand merci !!! Cela a l'air de fonctionné

    Par contre j'ai pus voir comme le disait Scorpyosis que les threads n'onts pas forcement la meme probabilité d'etre executé.

    Un thread est plus executé que l'autre, il y'a une methode simple pour contrer ce petit probleme ?

  7. #7
    ego
    ego est déconnecté
    Rédacteur

    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    1 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 883
    Billets dans le blog
    2
    Par défaut
    Tu as bien la notion de priorité mais si tu n'as rien fait toi même, il n'y a pas de raison pour qu'un thread s'exécute plus que l'autre.

  8. #8
    Membre chevronné Avatar de let_me_in
    Inscrit en
    Mai 2005
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 441
    Par défaut
    jette un coup d'oeuil sur les semaphores aussi(java.util.concurrent.Semaphore).

  9. #9
    Membre averti
    Inscrit en
    Décembre 2005
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 30
    Par défaut
    Merci pour votre aide

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

Discussions similaires

  1. [Thread] Synchronisation
    Par Flitz dans le forum Concurrence et multi-thread
    Réponses: 8
    Dernier message: 04/04/2006, 08h38
  2. Thread Synchronisation avec structure FIFO ??
    Par vincedom dans le forum MFC
    Réponses: 5
    Dernier message: 30/03/2006, 06h00
  3. Réponses: 1
    Dernier message: 23/05/2005, 15h52
  4. [Thread] synchronisation globale
    Par guejo dans le forum Concurrence et multi-thread
    Réponses: 6
    Dernier message: 16/02/2005, 11h56
  5. [Thread][Synchronisation] Exclusion mutuelle
    Par masto dans le forum Concurrence et multi-thread
    Réponses: 8
    Dernier message: 20/01/2005, 16h02

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