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

avec Java Discussion :

Problème wait et notifyAll


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2013
    Messages : 95
    Par défaut Problème wait et notifyAll
    Bonjour, je commence les thread en Java et je bloque sur un problème entre wait et notifyAll(). Mon programme possède un wait() qui attend dans une boucle un notifyAll() mais lorsque le notifyAll s'active les autres thread rèste bloquer sur le wait()...

    Merci d'avance

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    L'appel de notifyAll() sur une instance envoit un signal sur cette instance : tous les threads qui sont en attente dans un wait() sur cette même instance reçoive le signal, et arrête d'attendre. Dans ton code, le thread fait un wait sur lui-même, dans une boucle, et après la fin de la boucle, se notifie lui-même : autant dire qu'il rentre dans la première itération et n'en sort jamais, mais quand bien même, il se notifirait lui-même, ce qui ne servirait à rien, puisqu'il n'est plus en attente.

    En fait, il faut que l'instance sur laquelle tu fais le wait soit une seule instance commune , accessible par les autres threads, pour qu'ils puissent appeler notify() sur cette instance ( si notifyAll() est appelé, tous les threads en wait sur l'instance se "réveillent").
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2013
    Messages : 95
    Par défaut
    Salut et merci

    excuse moi j'ai du mal à comprendre, tu veux dire que je ne peux pas faire de notifyAll() dans la même instance courante ?
    J'aimerais synchroniser mes thread et je ne possède que x fois ce thread qui sont tous indépendant et doivent s'appeler en boucle dans un certain ordre

    Edit: est-il possible de notifier 1 seul thread précisément (avec notify) sans que cela ne soit aléatoire ou fixer sur la première instance..?

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Ce n'est pas un thread que l'on notifie, mais un sémaphore. En faisaint this.notifyAll et this.wait, tu utilise le threadCourant comme sémaphore. C'est bien, mais comme les autres threads s'utilisent eux même comme sémaphore, ça ne risque pas d'aller bien loin. T'as plein de sémaphores différents et pas deux threads qui utilisent le même.


    Avec notify, tu ne peux pas choisir le thread qui se réveille. Ca peut se mettre en place de manière détournée: mettre dans une variable commune le nom du thread qui dois travailler, tous les autres se rendormant immédiatement. Mais du coup, il faut synchroniser aussi l'appel à cette variable et si tu ne comprends pas déjà les base de wait/notify, tu codera ça n'importe comment et ce sera la catastrophe


    Par contre, comme chaque thread fait un wait() sur lui même (this.wait()) dans ton cas, il suffit que tu fasse un leThreadAReveiller.notify().

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2013
    Messages : 95
    Par défaut
    Salut tchize et merci de ta réponse.

    Il faudrait donc que chaque thread ai la liste de tout les autres thread ?
    par exemple public static Thread listeThread[nbThread] avec le tableau de thread du main

    et donc que je face :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
       private synchronized void donneLaMain() {
    	   tour = (tour%nbThreads)+1;
               listeThread[tour].notify();
       }

    Est-ce que j'ai bien comprit?

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    C'est ça l'idée pour la sélection du thread, mais il faut synchroniser sur l'instance que tu notifies (comme il faut synchroniser sur l'instance sur laquelle on appelle wait() le cas échéant).

    soit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    private synchronized void donneLaMain() {
       tour = (tour%nbThreads)+1;
       synchronized ( listeThread[tour] ) {
            listeThread[tour].notify();
       }
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

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

Discussions similaires

  1. Problème wait() et notifyAll()
    Par Liiinz dans le forum Agents de placement/Fenêtres
    Réponses: 1
    Dernier message: 12/09/2011, 20h28
  2. Réponses: 1
    Dernier message: 23/07/2009, 09h02
  3. Problème /wait (invite de commande dos)
    Par ludo.guy dans le forum Scripts/Batch
    Réponses: 4
    Dernier message: 13/10/2008, 10h48
  4. [Débutant] Synchronisation - wait() et notifyAll()
    Par Mattius007 dans le forum Langage
    Réponses: 7
    Dernier message: 14/01/2008, 12h27
  5. [débutant][Thread] wait et NotifyAll
    Par norkius dans le forum Concurrence et multi-thread
    Réponses: 2
    Dernier message: 14/03/2005, 15h28

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