Thread

kyokosan Messages postés 41 Date d'inscription dimanche 28 octobre 2007 Statut Membre Dernière intervention 10 avril 2008 - 21 févr. 2008 à 22:04
uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 - 25 févr. 2008 à 11:53
salut
j'ai un problème de thread quand je compile j'ai ce message d'erreur


java.lang.IllegalMonitorStateException: current thread not owner
 at java.lang.Object.wait(Native Method)
 
Voici la partie qui me cause problème:
public class Requete extends Thread {
void run()
.
.
.
.
.



              Dialog1.fin+=1;
             Dialog1.file_globale[Dialog1.fin]=this;
             synchronized( Dialog1.file_globale[Dialog1.fin]){
               try{Dialog1.file_globale[Dialog1.fin].wait();}//l'erreur a ce niveau
               catch(InterruptedException ex4){}
             }
.............}



public classe Agent{
....... while(Dialog1.fin>=Dialog1.deb){ //la file n'est pas vide



   synchronized(Dialog1.file_globale[Dialog1.deb]){
                       Dialog1.file_globale[Dialog1.deb].notify();
                       Dialog1.deb+=1;
              }
          }
            Dialog1.deb=0;//reinitialiser la file globale des requetes
        Dialog1.fin=-1;}
file_globale est un vecteur de type Requete (thread) et c'est dans cette file que je veux  bloquer les requêtes


le lancement de ce Thread se fait par
public class lancer(){Requete requ=new Requete[nb_req].........



for (int n = 0; n < nb_req; n++) {
    requ[n].start();}...............................}

l'erreur se trouve au niveau de l'instruction : try{file_globale[fin].wait();}


pourriez vous m'expliquer la raison de cette erreur
merci beaucoup
A voir également:

1 réponse

uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 9
25 févr. 2008 à 11:53
Ton code fonctionne pour moi:

public class TestRequete {

    private int nb_req = 5;

    public TestRequete() {
        lancer();
        try {
            Thread.sleep(5000);
        } catch (InterruptedException ex) {
        }
        Agent();
    }
//le lancement de ce Thread se fait par:
    private void lancer() {
        Requete[] requ = new Requete[nb_req];

        for (int n = 0; n < nb_req; n++) {
            requ[n] = new Requete(n);
            requ[n].start();
        }
    }

    private void Agent() {
        while (Dialog1.fin >= Dialog1.deb) { //la file n'est pas vide

            synchronized (Dialog1.file_globale[Dialog1.deb]) {
                Dialog1.file_globale[Dialog1.deb].notify();
                Dialog1.deb += 1;
            }
        }
        Dialog1.deb = 0;//reinitialiser la file globale des requetes
        Dialog1.fin = -1;
    }

    public static void main(String[] args) {
        new TestRequete();
    }
}

class Requete extends Thread {

    private int n;

    public Requete(int n) {
        this.n = n;
    }

    @Override
    public void run() {

        Dialog1.fin += 1;
        Dialog1.file_globale[Dialog1.fin] = this;
        synchronized (Dialog1.file_globale[Dialog1.fin]) {
            try {
                Dialog1.file_globale[Dialog1.fin].wait();
                System.out.println(n + " " + " OK");
            } catch (InterruptedException ex4) {
                ex4.printStackTrace();//l'erreur a ce niveau
            }
        }
    }
}

class Dialog1 {

    static int deb;
    static int fin = -1;
    /*file_globale est un vecteur de type Requete (thread)
    et c'est dans cette file que je veux  bloquer les requêtes*/
    static Requete[] file_globale = new Requete[10];
}
0
Rejoignez-nous