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 :

synchronisation entre deux threads


Sujet :

Concurrence et multi-thread Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 70
    Points : 46
    Points
    46
    Par défaut synchronisation entre deux threads
    Salut,

    J'ai une classe A qui étend Runnable.
    Cette classe A créée deux threads, un thread B et un C.

    les threads B et C démarrent en même temps.
    Mais le thread B ce met en attente (wait) dès le début, et repart quand le thread C a terminé.

    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
     
    class A extends Runnable {
     
      private B b;
      private C c;
     
      public void run(){
         b.start();
         c.start();
      }
     
      class B extends Thread {
        public void run(){
          synchronized(...){
            try{
              wait();
            }catch(...){}
          }
          /*plein de choses*/
        }
      }//class B
     
    }//class A
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class C extends Thread {
      public void run(){
        /*plein de choses*/
        synchronized(...){
           notify();
        }
      }
    }//class C
    Mon problème est que je ne sais pas quoi mettre dans les synchronized.
    J'ai essayé plein de truc mais ca n'a pas marché.

    Merci d'avance pour votre aide.

  2. #2
    Membre chevronné
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Points : 1 855
    Points
    1 855
    Par défaut
    c.join() ?

  3. #3
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Tu ne fais pas wait() et notify() sur le même objet, ça ne risque pas de les faire communiquer entre eux...

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 70
    Points : 46
    Points
    46
    Par défaut
    J'ai déjà essayé de les synchroniser sur un même objet.
    Je l'ai fais sur un Vecteur qu'ils utilisent tous les deux et aussi sur leur classe mais ça ne marche pas.

  5. #5
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    dans A par exemple, tu déclares une variable:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public static final Object lock = new Object();
    ensuite, pour faire wait(), tu fais A.lock.wait(); et notify() tu fais A.lock.notify();
    Et pour ce que tu mets dans le synchronized: synchronized(A.lock)

    PS: dans ton code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    class A extends Runnable
    c'est plutôt:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    class A implements Runnable

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 70
    Points : 46
    Points
    46
    Par défaut
    Je ne comprend pas, je fais ce que tu dis mais ca ne marche pas.

    Est ce vraiment nécessaire que la variable partagée soit déclarée static final.

  7. #7
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par chabfive
    Je ne comprend pas, je fais ce que tu dis mais ca ne marche pas.
    Qu'est-ce qui ne marche pas?

    Citation Envoyé par chabfive
    Est ce vraiment nécessaire que la variable partagée soit déclarée static final.
    final, de préférence car le verrou ne doit jamais être modifié ; static, dans ce cas oui pour que les 2 threads aient accès au même verrou...

  8. #8
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    PS: j'ai écrit un tuto sur la synchronisation en java, ça pourrait t'aider:
    http://rom.developpez.com/java-synchronisation/

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 70
    Points : 46
    Points
    46
    Par défaut
    ce qui ne marche pas, c'est que le thread B qui attend la fin du thread C ne se réveille pas.

  10. #10
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Ca n'est pas étonnant, tu n'as aucune garantie que B s'effectue avant C, et donc aussi bien C fait notify() (ce qui ne sert à rien personne n'attend) et ensuite B fait wait(), donc bah il attend et personne ne le réveille...

    Et encore, ça c'est dans le cas où tu utilises correctement la synchronisation (synchronized(...), wait et notify sur le même objet)...

Discussions similaires

  1. Synchronisation entre deux fichiers
    Par Chronax dans le forum Autres Logiciels
    Réponses: 8
    Dernier message: 11/10/2007, 00h52
  2. [2005] Synchronisation entre deux bases
    Par mister3957 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 06/08/2007, 12h46
  3. Opération mathématique entre deux Threads
    Par rvzip64 dans le forum Langage
    Réponses: 11
    Dernier message: 13/06/2005, 11h58
  4. Communication entre deux Threads
    Par rvzip64 dans le forum Langage
    Réponses: 13
    Dernier message: 28/01/2005, 09h14
  5. Synchronisation entre 2 threads
    Par bodbod dans le forum C++
    Réponses: 8
    Dernier message: 20/08/2004, 18h29

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