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] Petite question sur notify() et wait()


Sujet :

Concurrence et multi-thread Java

  1. #1
    Invité
    Invité(e)
    Par défaut [Thread] Petite question sur notify() et wait()
    Bonjour,

    J'ai crée un Thread Main. Celui-ci devrais effectuee ces actions :
    1° Charge LoginFrame
    2° Affiche LoginFrame
    3° Charge MenuFrame
    Attend
    5° Affiche MenuFrame

    Mon but étant d'avoir un Objet User crée avant d'afficher MenuFrame.

    J'avai essayé un flag qui se mettait à true une fois que l'utilisateur etait authentifie :
    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
     
    public class Main extends Thread {
      ...
      public static boolean flag = false;
      ...
     
      // realisation des étapes 1 à 3
      while(!flag){
                try {
                    sleep(100);
                    System.out.println("Attente");
                } catch (InterruptedException e) {
                    System.err.println("Thread Main : Impossible de mettre en attente.");
                    e.getClass();
                    e.printStackTrace();
                }
            }
     
    }
    LoginFrame mettait flag à true une fois l'utilisateur authentifié.

    Ca fonctionne mais n'est pas tres propre. Mieux vaut utiliser wait().

    j'ai donc crée une méthode synchronisée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    private synchronized void waitLogin() {
            try {    
                while(true){
                    System.out.println("Attente");
                    wait();
                }
                System.out.println("Plus en attente");
            } catch (InterruptedException ex){
                System.err.println("Erreure dans l'attente");
                ex.printStackTrace();            
            }
        }
    j'apelle cette méthode à la place de ma boucle pour sleep, aprés les étapes 1 à 3.

    Main est bien mis en attente Mais comment faire pour le réveiller depuis LoginFrame lorsque l'utilisateur est authentifié ?
    Comment appeler notify() sur Main ?

    Merci

  2. #2
    Membre habitué Avatar de guandal
    Profil pro
    Analyste programmeur
    Inscrit en
    Février 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2006
    Messages : 127
    Points : 168
    Points
    168
    Par défaut
    Salut,
    Quant l'utilisateur est authentifié il va mettre le fag à true;
    donc dès qu'il met le flag à true tu appelles la methode notifyAll().
    cela va debloquer tous les threads qui attendent cet evenement.



  3. #3
    Invité
    Invité(e)
    Par défaut
    Il n'a pas trop l'air d'apprécier :
    Exception in thread "AWT-EventQueue-0" java.lang.IllegalMonitorStateException: current thread not owner
    at java.lang.Object.notifyAll(Native Method)
    at threads.LoginFrame$1.actionPerformed(LoginFrame.java:64)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1849)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2169)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:420)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258)
    etc ...
    le code de mon bouton :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    btn.addActionListener(new ActionListener(){
                   public void actionPerformed(ActionEvent e) {
                       Main.flag = true;
                       notifyAll();
                       dispose();
                   } 
                });
    Je ne dois pas synchroniser quelque chose ?

  4. #4
    Membre habitué Avatar de guandal
    Profil pro
    Analyste programmeur
    Inscrit en
    Février 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2006
    Messages : 127
    Points : 168
    Points
    168
    Par défaut
    oui tu dois synchroniser la mise Main.flag = true;
    voudaris peut etre utiliser les Setter et Getter pour ça non? (c'est une proposition ).

  5. #5
    Invité
    Invité(e)
    Par défaut
    Oui evidemment,

    J'ai fait ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    // Dans Main 
    ..
    public synchronized void setFlag(boolean flag) {
            this.flag = flag;
            notify();
        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    // Dans LoginFrame
    ..
    btn.addActionListener(new ActionListener(){
                   public void actionPerformed(ActionEvent e) {
                       ?????? setFlag(true);
                       dispose();
                   } 
                });
    Mais pour accéder à setFlag() je suis obligé d'avoir une instance de Main.
    Et je ne veux pas devoir passer d'instance de Main à LoginFrame.
    Si je met setFlag() en static, je n'ai plus accés à notifyAll()

    edit :
    J'ai créer une méthode synchronisée setFlag() dans LoginFrame mais ça ne fonctionne toujours pas..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    // Login Frame 
    ..
    public synchronized void setFlag(){
            Main.flag = true;
            notifyAll();
        }
    LoginFrame appele bien setFlag() et ensuite dipose() mais Main ne reprend pas..

    edit2 :
    Lorsque je passe la référence de Main a LoginFrame().
    Alors je peux appeler setFlag() de Main et ça fonctionne.

    Mais je voudrais le faire sans devoir passer Main en paramètre à LoginFrame
    Dernière modification par Invité ; 12/05/2006 à 11h59.

  6. #6
    Membre habitué Avatar de guandal
    Profil pro
    Analyste programmeur
    Inscrit en
    Février 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2006
    Messages : 127
    Points : 168
    Points
    168
    Par défaut
    je me demande si ton loginFrame est un thread.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Non c'est une JFrame tout simplement mais je ne vois pas trop pourquoi elle devrait être un thread ?
    A moins que synchronized ne puisse fonctionner que dans un Thread ?

  8. #8
    Membre habitué Avatar de guandal
    Profil pro
    Analyste programmeur
    Inscrit en
    Février 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2006
    Messages : 127
    Points : 168
    Points
    168
    Par défaut
    Citation Envoyé par Blaise1
    A moins que synchronized ne puisse fonctionner dans un Thread ?
    Exactement je pense à cela car mon experience ne s'arrete qu'entre thread .
    Mais ma connaissance ne me permet pas de t'aider plus .
    Désolé.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Voilà une "réponse" :
    "o'reilly: Java Fundamental Classes Reference"
    The synchronized keyword provides a way to ensure that only one thread at a
    time can execute a block of code. Before executing the block in a synchronized statement, the
    current thread must obtain a lock for the object referenced by the expression.
    Merci pour ton aide.

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

Discussions similaires

  1. Petite question sur la façon de faire une sorte de thread
    Par bit_o dans le forum GTK+ avec C & C++
    Réponses: 5
    Dernier message: 09/05/2007, 23h28
  2. [Visuel XP] Petite question sur le theme XP...
    Par ZoumZoumMan dans le forum C++Builder
    Réponses: 12
    Dernier message: 20/01/2005, 14h41
  3. petite question sur le composant IBX ...
    Par vbcasimir dans le forum Bases de données
    Réponses: 4
    Dernier message: 05/01/2005, 10h33
  4. Réponses: 3
    Dernier message: 08/12/2004, 13h58
  5. Petite question sur les performances de Postgres ...
    Par cb44 dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 13/01/2004, 13h49

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