OVH Cloud OVH Cloud

Problème de moniteur ( wait ) !

1 réponse
Avatar
Xavier Seneque
Bonjour tout le monde :)

voili voilou, je fait une classe qui tourne sur un thread qui a besoin
de se synchroniser avec une autre qui est sur un autre thread... et ça
marche pas ! ( évidement :) )

alors voila le synopsis :

public abstract class Toto extends Thread{
public Toto(){
super();
...
}

public void ajouterElement(Truc titi){
synchronized (maFile){
maFile.addLast(tree);
}
this.notify();
}

public void run(){
...
if( maFile.isEmpty() ) {
try{
this.wait();
} catch (InterruptedException e){}
}
...
}
}

vu que la classe est abstraite, c'est donc une sous classe que j'instancie.

le lancement du thread faisant tourner une sous classe de Toto est comme
ça :

public class Tutu extends DefaultHandler {
private Toto toto;

public Tutu (Toto xth){
toto = xth;
toto.start();
}
...
}


et j'ai une belle exception :
Exception in thread "Thread-0" java.lang.IllegalMonitorStateException
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:474)
at sheepim.parsing.Toto.run(Toto.java:62)

alors voilà, comme une IllegalMonitorStateException viens lorsque le
thread courant n'est pas propriétaire du moniteur de l'objet...

quelqu'un sait d'où viens le probleme ?

et autre question : je pense que j'ai un probleme d'exclusion mutuelle
sur l'objet maFile, ( dans le run, dans le if ), comment pourrais je y
acceder de façon sure, car apres il y a un wait, donc je peut pas le
mettre dans un synchronized non ?

merci beaucoup !

1 réponse

Avatar
Frédéric Lachasse
"Xavier Seneque" wrote in message
news:42387ec4$0$31188$
Bonjour tout le monde :)

voili voilou, je fait une classe qui tourne sur un thread qui a besoin de
se synchroniser avec une autre qui est sur un autre thread... et ça marche
pas ! ( évidement :) )

alors voila le synopsis :

public abstract class Toto extends Thread{
public Toto(){
super();
...
}

public void ajouterElement(Truc titi){
synchronized (maFile){
maFile.addLast(tree);
}
this.notify();
}

public void run(){
...
if( maFile.isEmpty() ) {
try{
this.wait();
} catch (InterruptedException e){}
}
...
}
}

vu que la classe est abstraite, c'est donc une sous classe que
j'instancie.

le lancement du thread faisant tourner une sous classe de Toto est comme
ça :

public class Tutu extends DefaultHandler {
private Toto toto;

public Tutu (Toto xth){
toto = xth;
toto.start();
}
...
}


et j'ai une belle exception :
Exception in thread "Thread-0" java.lang.IllegalMonitorStateException
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:474)
at sheepim.parsing.Toto.run(Toto.java:62)
alors voilà, comme une IllegalMonitorStateException viens lorsque le
thread courant n'est pas propriétaire du moniteur de l'objet...

quelqu'un sait d'où viens le probleme ?

et autre question : je pense que j'ai un probleme d'exclusion mutuelle sur
l'objet maFile, ( dans le run, dans le if ), comment pourrais je y acceder
de façon sure, car apres il y a un wait, donc je peut pas le mettre dans
un synchronized non ?


Justement, être propriétaire du moniteur d'un objet veut dire être dans un
bloc "synchronized" de l'objet. Un appel à wait() doit être dans un bloc
synchronized. "Mais, comment !?..." tu vas dire. En fait, si l'objet n'est
pas notifier avant l'appel à wait() (donc le wait va bloquer), le thread
libère le moniteur avant de rendre la main, et quand il reçoit le signal
notify(), il reprend le moniteur avant de continuer.

public void run(){
...
Item item = null;
synchronized(maFile) { // lock on maFile
if( maFile.isEmpty() ) {
try {
this.wait(); // unlock, wait, re-lock
} catch (InterruptedException e) {}
}

item = maFile.pop(); // maFile is still locked
} // unlock maFile
...
}

--
Frédéric Lachasse - ECP86