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 :

IllegalMonitorStateException et wait() inactif


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Balbuzard
    Profil pro
    Inscrit en
    Août 2008
    Messages
    381
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 381
    Par défaut IllegalMonitorStateException et wait() inactif
    Bonjour,

    Je ne comprends absolument pas le comportement de ma méthode, on m'a expliqué de la méthode wait() appliqué à un thread le met en attente, il ne fait donc plus rien jusqu'à ce qu'un autre thread (comme le main par exemple) lui matte un notify() ou un notifyAll().

    J'ai une JFrame avec un bouton start qui lance un thread "calcul"

    Voici ce que je met dans la méthode ActionPerformed:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if(arg0.getActionCommand().equals("Start"))
    		{
    			calcul.start();
    			try{
    				calcul.wait();
    			}catch(InterruptedException ie) {ie.printStackTrace();}
    		}
    Le thread est initié dès la construction de la classe affichant une fenêtre.

    Voici la méthode run() de mon Thread :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public void run()
    	{
    	    int monInt=nombre;
    	    while(true)
    	    {
    	    	monInt++;
    		essai.getLabel().setText("The Number is : "+monInt);
    		essai.setNombre(monInt);
    	    }
    	}
    Normalement, le Thread devrait commencé et immédiatement après se mettre en pause, mais il commence, ne se met pas en pause, et renvoi l'exception java.lang.IllegalMonitorStateException sur la ligne ou je fais mon wait().

    Quelqu'un pourrait-il m'expliquer ceci?

    Je suis déjà arriver à faire des pauses avec les Thread, mais j'aimerais savoir pourquoi les méthodes wait()/notify() renvoyent ce type d'erreurs sans faire ce qu'elles sont censées faire.

    Je vous remercie vivement de vos réponses

  2. #2
    Membre chevronné
    Profil pro
    Développeur Java
    Inscrit en
    Novembre 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2007
    Messages : 301
    Par défaut
    Normalement, le Thread devrait commencé et immédiatement après se mettre en pause, mais il commence, ne se met pas en pause, et renvoi l'exception java.lang.IllegalMonitorStateException sur la ligne ou je fais mon wait().
    Le code fait toujours exactement ce qu'on lui demande faire. Dans ton cas, le problème est que tu n'as lu ce que faisait la méthode wait.

    Causes the current thread to wait until another thread invokes the notify() method or the notifyAll() method for this object.
    Le thread courant lorsque tu fais appelles au wait est l'EDT. Donc tu essaies de mettre en pause l'EDT et non le thread que tu as crée.

    IllegalMonitorStateException - if the current thread is not the owner of the object's monitor.
    L'EDT ne semble pas être le propriétaire de l'objet. La méthode renvoie donc l'exception attendue.

    PS : Tout thread effectuant des modifications sur l'interface doit être synchronisé avec l'EDT en utilisant les méthodes de SwingUtilities. Il existe sur ce site un cours à ce sujet.

    Source : http://java.sun.com/javase/6/docs/ap...ct.html#wait()

  3. #3
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Les wait/notify s'utilise sur l'objet utilisé pour la synchronisation, et donc dans un bloc synchronized.

    L'IllegalMonitorStateException indique que ce n'est pas le cas dans ton code.

    a++

Discussions similaires

  1. [Thread] IllegalMonitorStateException
    Par xavlours dans le forum Concurrence et multi-thread
    Réponses: 6
    Dernier message: 13/03/2012, 15h25
  2. Exception Wait java.lang.IllegalMonitorStateException
    Par darkgenesis dans le forum Java ME
    Réponses: 1
    Dernier message: 27/10/2008, 14h13
  3. Réponses: 8
    Dernier message: 03/07/2004, 12h53
  4. Fiche à Onglets: Rendre inactif un TTabSheet
    Par Akta3d dans le forum C++Builder
    Réponses: 7
    Dernier message: 21/04/2004, 14h40
  5. BIOS - WAIT (AT,PS)
    Par Biglo dans le forum x86 16-bits
    Réponses: 4
    Dernier message: 18/02/2003, 20h50

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