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();
}
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 ?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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(); }
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.
item = maFile.pop(); // maFile is still locked } // unlock maFile ... }
-- Frédéric Lachasse - ECP86
"Xavier Seneque" <xavier.seneque@wanadoo.fr> wrote in message
news:42387ec4$0$31188$626a14ce@news.free.fr...
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();
}
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.
"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(); }
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.