J'ai un problème de synchronisation... J'ai un programme qui doit effectuer
une action toute les 2 secondes, toutes les demi-seconde ou le plus souvent
possible. Entre deux execution de l'action, il regarde s'il doit
s'interrompre ou s'arreter. J'ai donc une methode de ce genre :
private String __monitor;
private int time; // peut prendre une de ces valeurs : 1, 500, 2000
Un thread est dédié à l'execution de cette action. Un autre (dans mon cas
celui qui gère les évenement de l'interface graphique) peut le controler.
J'ai un bouton "stop" qui appelle la méthode suivante :
Aucune autre méthode ne met de verrou sur __monitor. Je teste certes sa
valeur en dehors d'un block synchronized mais je n'appelle nulle part
ailleurs wait() ou notify(). Lorsque time = 500 ou 2000, jamais de problème,
mais lorsqu'il vaut 1, j'ai tout le temps des
IllegalMonitorStateException... Il dit qu'il n'est pas propriétaire du
monitor, alors qu'il est justement dans un block synchronized sur ce
moniteur...
Ai-je fait une erreur ? Est-ce interdit ne serait-ce que d'accéder à la
valeur d'un objet que l'on utilise comme moniteur ? Ou est-ce que la
milliseconde d'attente ne laisse justement même pas le temps au moniteur de
se mettre en place ?
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
TestMan
Bonjour,
Le programmation des Thread est toujours trés délicate, personellement j'évite de les manipuller directement sans passer par des biblio (comme l'API concurente par exemple).
Si le but et l'execution à intervale répétitifs. Pourquoi ne pas tout simplement passer par un Timer en remplacement ?
L'association entre un thread et un timer permetrait par exemple d'avoir une fonction "le plus vite possible" mais avec un rappel ou un rafraichissement régulier (selon le besoin).
S'il sagit par ex d'un rafraichisement d'infrmation à présenter à l'écran, alors mieux vaut diretement aller au quasi graal : http://download.java.net/jdk6/docs/api/javax/swing/SwingWorker.html
A+
TM
Bonjour,
J'ai un problème de synchronisation... J'ai un programme qui doit effectuer une action toute les 2 secondes, toutes les demi-seconde ou le plus souvent possible. Entre deux execution de l'action, il regarde s'il doit s'interrompre ou s'arreter. J'ai donc une methode de ce genre :
private String __monitor; private int time; // peut prendre une de ces valeurs : 1, 500, 2000
Un thread est dédié à l'execution de cette action. Un autre (dans mon cas celui qui gère les évenement de l'interface graphique) peut le controler. J'ai un bouton "stop" qui appelle la méthode suivante :
Aucune autre méthode ne met de verrou sur __monitor. Je teste certes sa valeur en dehors d'un block synchronized mais je n'appelle nulle part ailleurs wait() ou notify(). Lorsque time = 500 ou 2000, jamais de problème, mais lorsqu'il vaut 1, j'ai tout le temps des IllegalMonitorStateException... Il dit qu'il n'est pas propriétaire du monitor, alors qu'il est justement dans un block synchronized sur ce moniteur...
Ai-je fait une erreur ? Est-ce interdit ne serait-ce que d'accéder à la valeur d'un objet que l'on utilise comme moniteur ? Ou est-ce que la milliseconde d'attente ne laisse justement même pas le temps au moniteur de se mettre en place ?
Merci pour vos réponses !
wamli
Bonjour,
Le programmation des Thread est toujours trés délicate, personellement
j'évite de les manipuller directement sans passer par des biblio (comme
l'API concurente par exemple).
Si le but et l'execution à intervale répétitifs. Pourquoi ne pas tout
simplement passer par un Timer en remplacement ?
L'association entre un thread et un timer permetrait par exemple d'avoir
une fonction "le plus vite possible" mais avec un rappel ou un
rafraichissement régulier (selon le besoin).
S'il sagit par ex d'un rafraichisement d'infrmation à présenter à
l'écran, alors mieux vaut diretement aller au quasi graal :
http://download.java.net/jdk6/docs/api/javax/swing/SwingWorker.html
A+
TM
Bonjour,
J'ai un problème de synchronisation... J'ai un programme qui doit effectuer
une action toute les 2 secondes, toutes les demi-seconde ou le plus souvent
possible. Entre deux execution de l'action, il regarde s'il doit
s'interrompre ou s'arreter. J'ai donc une methode de ce genre :
private String __monitor;
private int time; // peut prendre une de ces valeurs : 1, 500, 2000
Un thread est dédié à l'execution de cette action. Un autre (dans mon cas
celui qui gère les évenement de l'interface graphique) peut le controler.
J'ai un bouton "stop" qui appelle la méthode suivante :
Aucune autre méthode ne met de verrou sur __monitor. Je teste certes sa
valeur en dehors d'un block synchronized mais je n'appelle nulle part
ailleurs wait() ou notify(). Lorsque time = 500 ou 2000, jamais de problème,
mais lorsqu'il vaut 1, j'ai tout le temps des
IllegalMonitorStateException... Il dit qu'il n'est pas propriétaire du
monitor, alors qu'il est justement dans un block synchronized sur ce
moniteur...
Ai-je fait une erreur ? Est-ce interdit ne serait-ce que d'accéder à la
valeur d'un objet que l'on utilise comme moniteur ? Ou est-ce que la
milliseconde d'attente ne laisse justement même pas le temps au moniteur de
se mettre en place ?
Le programmation des Thread est toujours trés délicate, personellement j'évite de les manipuller directement sans passer par des biblio (comme l'API concurente par exemple).
Si le but et l'execution à intervale répétitifs. Pourquoi ne pas tout simplement passer par un Timer en remplacement ?
L'association entre un thread et un timer permetrait par exemple d'avoir une fonction "le plus vite possible" mais avec un rappel ou un rafraichissement régulier (selon le besoin).
S'il sagit par ex d'un rafraichisement d'infrmation à présenter à l'écran, alors mieux vaut diretement aller au quasi graal : http://download.java.net/jdk6/docs/api/javax/swing/SwingWorker.html
A+
TM
Bonjour,
J'ai un problème de synchronisation... J'ai un programme qui doit effectuer une action toute les 2 secondes, toutes les demi-seconde ou le plus souvent possible. Entre deux execution de l'action, il regarde s'il doit s'interrompre ou s'arreter. J'ai donc une methode de ce genre :
private String __monitor; private int time; // peut prendre une de ces valeurs : 1, 500, 2000
Un thread est dédié à l'execution de cette action. Un autre (dans mon cas celui qui gère les évenement de l'interface graphique) peut le controler. J'ai un bouton "stop" qui appelle la méthode suivante :
Aucune autre méthode ne met de verrou sur __monitor. Je teste certes sa valeur en dehors d'un block synchronized mais je n'appelle nulle part ailleurs wait() ou notify(). Lorsque time = 500 ou 2000, jamais de problème, mais lorsqu'il vaut 1, j'ai tout le temps des IllegalMonitorStateException... Il dit qu'il n'est pas propriétaire du monitor, alors qu'il est justement dans un block synchronized sur ce moniteur...
Ai-je fait une erreur ? Est-ce interdit ne serait-ce que d'accéder à la valeur d'un objet que l'on utilise comme moniteur ? Ou est-ce que la milliseconde d'attente ne laisse justement même pas le temps au moniteur de se mettre en place ?
Merci pour vos réponses !
wamli
Sylvain
TestMan wrote on 11/05/2006 15:32:
Le programmation des Thread est toujours trés délicate, personellement j'évite de les manipuller directement sans passer par des biblio (comme l'API concurente par exemple).
j'ai la vague impression que la question n'était pas "que dois-je utiliser d'autre"...
S'il sagit par ex d'un rafraichisement d'infrmation à présenter à l'écran, alors mieux vaut diretement aller au quasi graal : http://download.java.net/jdk6/docs/api/javax/swing/SwingWorker.html
waouww pour un graal "draft beta 2", je pense qu'en effet il faut avoir la foi ...
Sylvain.
TestMan wrote on 11/05/2006 15:32:
Le programmation des Thread est toujours trés délicate, personellement
j'évite de les manipuller directement sans passer par des biblio (comme
l'API concurente par exemple).
j'ai la vague impression que la question n'était pas "que dois-je
utiliser d'autre"...
S'il sagit par ex d'un rafraichisement d'infrmation à présenter à
l'écran, alors mieux vaut diretement aller au quasi graal :
http://download.java.net/jdk6/docs/api/javax/swing/SwingWorker.html
waouww pour un graal "draft beta 2", je pense qu'en effet il faut avoir
la foi ...
Le programmation des Thread est toujours trés délicate, personellement j'évite de les manipuller directement sans passer par des biblio (comme l'API concurente par exemple).
j'ai la vague impression que la question n'était pas "que dois-je utiliser d'autre"...
S'il sagit par ex d'un rafraichisement d'infrmation à présenter à l'écran, alors mieux vaut diretement aller au quasi graal : http://download.java.net/jdk6/docs/api/javax/swing/SwingWorker.html
waouww pour un graal "draft beta 2", je pense qu'en effet il faut avoir la foi ...
Sylvain.
Wamli
Oui je pense que c'est cela.
On ne sait jamais très bien avec Java ce qu'il fait lorsqu'on assigne des valeurs... mais vous devez avoir raison :
si on a
String test = "toto";
cela crée une structure "String" contenant toto et un test pointe sur cette structure
ensuite, si on fait
test = "titi",
au lieu de remplacer la structure toto par titi, il en crée une autre, et fait pointer test sur cette nouvelle structure, puis l'ancienne passe normalement au Garbage collector puisque rien d'autre ne pointe dessus... ok ok
bon, je vais trouver une autre solution pour garder le même objet comme moniteur, même si sa valeur change.
La valeur 1 est extrême, vous avez raison. J'ai en fait une sorte de "boite de vitesse" et la valeur 1 représente le plus grand rapport = le temps réel (pas d'attente). Car 0, c'est le neutre et rien ne se passe
Merci pour votre contribution
wamli
"Hervé AGNOUX" wrote in message news:4463497e$0$281$
Wamli wrote:
Merci pour vos réponses !
Le "1" est une valeur un peu extrême... Je ne sais pas comment elle est exactement interprétée, car je ne connais aucun système qui commute toutes les 1 millisecondes, mais enfin je ne connais pas tout de l'informatique. Peut être avez-vous une machine spéciale ?
Au sujet de votre code, l'erreur vient de ce que vous changez la valeur de __monitor en le mettant à "stop". Donc il peut se produire une sorte de pataques de synchronisation dans votre thread de wait :
1) "thread wait" synchronized sur __monitor OK
2) POUF ! exécution commute sur stop
3) "thread stop" change la valeur de __monitor, la met à "stop".
4) POUF ! exécution commute sur wait
5) "thread wait se met en wait sur __monitor, qui n'est plus le même que celui qui a donné le verrou
6) PLAF ! IllegalMonitorStateException.
Bon courage.
-- Hervé AGNOUX http://www.diaam-informatique.com
Oui je pense que c'est cela.
On ne sait jamais très bien avec Java ce qu'il fait lorsqu'on assigne des
valeurs... mais vous devez avoir raison :
si on a
String test = "toto";
cela crée une structure "String" contenant toto et un test pointe sur cette
structure
ensuite, si on fait
test = "titi",
au lieu de remplacer la structure toto par titi, il en crée une autre, et
fait pointer test sur cette nouvelle structure, puis l'ancienne passe
normalement au Garbage collector puisque rien d'autre ne pointe dessus... ok
ok
bon, je vais trouver une autre solution pour garder le même objet comme
moniteur, même si sa valeur change.
La valeur 1 est extrême, vous avez raison. J'ai en fait une sorte de "boite
de vitesse" et la valeur 1 représente le plus grand rapport = le temps réel
(pas d'attente). Car 0, c'est le neutre et rien ne se passe
Merci pour votre contribution
wamli
"Hervé AGNOUX" <herve.xx.agnoux@diaam-informatique.com.zz> wrote in message
news:4463497e$0$281$636a55ce@news.free.fr...
Wamli wrote:
Merci pour vos réponses !
Le "1" est une valeur un peu extrême... Je ne sais pas comment elle est
exactement interprétée, car je ne connais aucun système qui commute toutes
les 1 millisecondes, mais enfin je ne connais pas tout de l'informatique.
Peut être avez-vous une machine spéciale ?
Au sujet de votre code, l'erreur vient de ce que vous changez la valeur de
__monitor en le mettant à "stop". Donc il peut se produire une sorte de
pataques de synchronisation dans votre thread de wait :
1) "thread wait" synchronized sur __monitor OK
2) POUF ! exécution commute sur stop
3) "thread stop" change la valeur de __monitor, la met à "stop".
4) POUF ! exécution commute sur wait
5) "thread wait se met en wait sur __monitor, qui n'est plus le même que
celui qui a donné le verrou
On ne sait jamais très bien avec Java ce qu'il fait lorsqu'on assigne des valeurs... mais vous devez avoir raison :
si on a
String test = "toto";
cela crée une structure "String" contenant toto et un test pointe sur cette structure
ensuite, si on fait
test = "titi",
au lieu de remplacer la structure toto par titi, il en crée une autre, et fait pointer test sur cette nouvelle structure, puis l'ancienne passe normalement au Garbage collector puisque rien d'autre ne pointe dessus... ok ok
bon, je vais trouver une autre solution pour garder le même objet comme moniteur, même si sa valeur change.
La valeur 1 est extrême, vous avez raison. J'ai en fait une sorte de "boite de vitesse" et la valeur 1 représente le plus grand rapport = le temps réel (pas d'attente). Car 0, c'est le neutre et rien ne se passe
Merci pour votre contribution
wamli
"Hervé AGNOUX" wrote in message news:4463497e$0$281$
Wamli wrote:
Merci pour vos réponses !
Le "1" est une valeur un peu extrême... Je ne sais pas comment elle est exactement interprétée, car je ne connais aucun système qui commute toutes les 1 millisecondes, mais enfin je ne connais pas tout de l'informatique. Peut être avez-vous une machine spéciale ?
Au sujet de votre code, l'erreur vient de ce que vous changez la valeur de __monitor en le mettant à "stop". Donc il peut se produire une sorte de pataques de synchronisation dans votre thread de wait :
1) "thread wait" synchronized sur __monitor OK
2) POUF ! exécution commute sur stop
3) "thread stop" change la valeur de __monitor, la met à "stop".
4) POUF ! exécution commute sur wait
5) "thread wait se met en wait sur __monitor, qui n'est plus le même que celui qui a donné le verrou
6) PLAF ! IllegalMonitorStateException.
Bon courage.
-- Hervé AGNOUX http://www.diaam-informatique.com
Hervé AGNOUX
Wamli wrote:
Merci pour vos réponses !
Le "1" est une valeur un peu extrême... Je ne sais pas comment elle est exactement interprétée, car je ne connais aucun système qui commute toutes les 1 millisecondes, mais enfin je ne connais pas tout de l'informatique. Peut être avez-vous une machine spéciale ?
Au sujet de votre code, l'erreur vient de ce que vous changez la valeur de __monitor en le mettant à "stop". Donc il peut se produire une sorte de pataques de synchronisation dans votre thread de wait :
1) "thread wait" synchronized sur __monitor OK
2) POUF ! exécution commute sur stop
3) "thread stop" change la valeur de __monitor, la met à "stop".
4) POUF ! exécution commute sur wait
5) "thread wait se met en wait sur __monitor, qui n'est plus le même que celui qui a donné le verrou
6) PLAF ! IllegalMonitorStateException.
Bon courage.
-- Hervé AGNOUX http://www.diaam-informatique.com
Wamli wrote:
Merci pour vos réponses !
Le "1" est une valeur un peu extrême... Je ne sais pas comment elle est
exactement interprétée, car je ne connais aucun système qui commute toutes
les 1 millisecondes, mais enfin je ne connais pas tout de l'informatique.
Peut être avez-vous une machine spéciale ?
Au sujet de votre code, l'erreur vient de ce que vous changez la valeur de
__monitor en le mettant à "stop". Donc il peut se produire une sorte de
pataques de synchronisation dans votre thread de wait :
1) "thread wait" synchronized sur __monitor OK
2) POUF ! exécution commute sur stop
3) "thread stop" change la valeur de __monitor, la met à "stop".
4) POUF ! exécution commute sur wait
5) "thread wait se met en wait sur __monitor, qui n'est plus le même que
celui qui a donné le verrou
Le "1" est une valeur un peu extrême... Je ne sais pas comment elle est exactement interprétée, car je ne connais aucun système qui commute toutes les 1 millisecondes, mais enfin je ne connais pas tout de l'informatique. Peut être avez-vous une machine spéciale ?
Au sujet de votre code, l'erreur vient de ce que vous changez la valeur de __monitor en le mettant à "stop". Donc il peut se produire une sorte de pataques de synchronisation dans votre thread de wait :
1) "thread wait" synchronized sur __monitor OK
2) POUF ! exécution commute sur stop
3) "thread stop" change la valeur de __monitor, la met à "stop".
4) POUF ! exécution commute sur wait
5) "thread wait se met en wait sur __monitor, qui n'est plus le même que celui qui a donné le verrou
6) PLAF ! IllegalMonitorStateException.
Bon courage.
-- Hervé AGNOUX http://www.diaam-informatique.com
alexandre cartapanis
Bonjour,
J'ai un problème de synchronisation... J'ai un programme qui doit eff ectuer une action toute les 2 secondes, toutes les demi-seconde ou le plus sou vent possible. Entre deux execution de l'action, il regarde s'il doit s'interrompre ou s'arreter. J'ai donc une methode de ce genre :
private String __monitor; private int time; // peut prendre une de ces valeurs : 1, 500, 2000
Un thread est dédié à l'execution de cette action. Un autre (dans mon cas celui qui gère les évenement de l'interface graphique) peut le cont roler. J'ai un bouton "stop" qui appelle la méthode suivante :
Aucune autre méthode ne met de verrou sur __monitor. Je teste certes sa valeur en dehors d'un block synchronized mais je n'appelle nulle part ailleurs wait() ou notify(). Lorsque time = 500 ou 2000, jamais de pr oblème, mais lorsqu'il vaut 1, j'ai tout le temps des IllegalMonitorStateException... Il dit qu'il n'est pas propriétaire d u monitor, alors qu'il est justement dans un block synchronized sur ce moniteur...
Ai-je fait une erreur ? Est-ce interdit ne serait-ce que d'accéder à la valeur d'un objet que l'on utilise comme moniteur ? Ou est-ce que la milliseconde d'attente ne laisse justement même pas le temps au monit eur de se mettre en place ?
Merci pour vos réponses !
wamli
Voici ma solution a ce problème (je ne dis pas qu'elle est parfaite, mais je n'ai jamais eu de souci avec).
class Timer implements Runnable {
private volatile boolean running; private int time;
private Thread runner;
public synchronized void start() { this.running = true; this.runner = new Thread(this); this.runner.start(); }
J'ai un problème de synchronisation... J'ai un programme qui doit eff ectuer
une action toute les 2 secondes, toutes les demi-seconde ou le plus sou vent
possible. Entre deux execution de l'action, il regarde s'il doit
s'interrompre ou s'arreter. J'ai donc une methode de ce genre :
private String __monitor;
private int time; // peut prendre une de ces valeurs : 1, 500, 2000
Un thread est dédié à l'execution de cette action. Un autre (dans mon cas
celui qui gère les évenement de l'interface graphique) peut le cont roler.
J'ai un bouton "stop" qui appelle la méthode suivante :
Aucune autre méthode ne met de verrou sur __monitor. Je teste certes sa
valeur en dehors d'un block synchronized mais je n'appelle nulle part
ailleurs wait() ou notify(). Lorsque time = 500 ou 2000, jamais de pr oblème,
mais lorsqu'il vaut 1, j'ai tout le temps des
IllegalMonitorStateException... Il dit qu'il n'est pas propriétaire d u
monitor, alors qu'il est justement dans un block synchronized sur ce
moniteur...
Ai-je fait une erreur ? Est-ce interdit ne serait-ce que d'accéder à la
valeur d'un objet que l'on utilise comme moniteur ? Ou est-ce que la
milliseconde d'attente ne laisse justement même pas le temps au monit eur de
se mettre en place ?
Merci pour vos réponses !
wamli
Voici ma solution a ce problème (je ne dis pas qu'elle est parfaite,
mais je n'ai jamais eu de souci avec).
class Timer implements Runnable {
private volatile boolean running;
private int time;
private Thread runner;
public synchronized void start() {
this.running = true;
this.runner = new Thread(this);
this.runner.start();
}
J'ai un problème de synchronisation... J'ai un programme qui doit eff ectuer une action toute les 2 secondes, toutes les demi-seconde ou le plus sou vent possible. Entre deux execution de l'action, il regarde s'il doit s'interrompre ou s'arreter. J'ai donc une methode de ce genre :
private String __monitor; private int time; // peut prendre une de ces valeurs : 1, 500, 2000
Un thread est dédié à l'execution de cette action. Un autre (dans mon cas celui qui gère les évenement de l'interface graphique) peut le cont roler. J'ai un bouton "stop" qui appelle la méthode suivante :
Aucune autre méthode ne met de verrou sur __monitor. Je teste certes sa valeur en dehors d'un block synchronized mais je n'appelle nulle part ailleurs wait() ou notify(). Lorsque time = 500 ou 2000, jamais de pr oblème, mais lorsqu'il vaut 1, j'ai tout le temps des IllegalMonitorStateException... Il dit qu'il n'est pas propriétaire d u monitor, alors qu'il est justement dans un block synchronized sur ce moniteur...
Ai-je fait une erreur ? Est-ce interdit ne serait-ce que d'accéder à la valeur d'un objet que l'on utilise comme moniteur ? Ou est-ce que la milliseconde d'attente ne laisse justement même pas le temps au monit eur de se mettre en place ?
Merci pour vos réponses !
wamli
Voici ma solution a ce problème (je ne dis pas qu'elle est parfaite, mais je n'ai jamais eu de souci avec).
class Timer implements Runnable {
private volatile boolean running; private int time;
private Thread runner;
public synchronized void start() { this.running = true; this.runner = new Thread(this); this.runner.start(); }
dans l'article , Wamli à a écrit le 11/05/06 12:13 :
Bonjour,
J'ai un problème de synchronisation... J'ai un programme qui doit effectuer une action toute les 2 secondes, toutes les demi-seconde ou le plus souvent possible. Entre deux execution de l'action, il regarde s'il doit s'interrompre ou s'arreter. J'ai donc une methode de ce genre :
private String __monitor; private int time; // peut prendre une de ces valeurs : 1, 500, 2000
Un thread est dédié à l'execution de cette action. Un autre (dans mon cas celui qui gère les évenement de l'interface graphique) peut le controler. J'ai un bouton "stop" qui appelle la méthode suivante :
Aucune autre méthode ne met de verrou sur __monitor. Je teste certes sa valeur en dehors d'un block synchronized mais je n'appelle nulle part ailleurs wait() ou notify(). Lorsque time = 500 ou 2000, jamais de problème, mais lorsqu'il vaut 1, j'ai tout le temps des IllegalMonitorStateException... Il dit qu'il n'est pas propriétaire du monitor, alors qu'il est justement dans un block synchronized sur ce moniteur...
Ai-je fait une erreur ? Est-ce interdit ne serait-ce que d'accéder à la valeur d'un objet que l'on utilise comme moniteur ? Ou est-ce que la milliseconde d'attente ne laisse justement même pas le temps au moniteur de se mettre en place ?
Merci pour vos réponses !
wamli
je mettrais __monitor volatile qui empeche la duplication de la variable
(optimisation du compiler) dans chaque thread.
dans l'article 1147342439_533@sicinfo3.epfl.ch, Wamli à wamli@web.de a écrit
le 11/05/06 12:13 :
Bonjour,
J'ai un problème de synchronisation... J'ai un programme qui doit effectuer
une action toute les 2 secondes, toutes les demi-seconde ou le plus souvent
possible. Entre deux execution de l'action, il regarde s'il doit
s'interrompre ou s'arreter. J'ai donc une methode de ce genre :
private String __monitor;
private int time; // peut prendre une de ces valeurs : 1, 500, 2000
Un thread est dédié à l'execution de cette action. Un autre (dans mon cas
celui qui gère les évenement de l'interface graphique) peut le controler.
J'ai un bouton "stop" qui appelle la méthode suivante :
Aucune autre méthode ne met de verrou sur __monitor. Je teste certes sa
valeur en dehors d'un block synchronized mais je n'appelle nulle part
ailleurs wait() ou notify(). Lorsque time = 500 ou 2000, jamais de problème,
mais lorsqu'il vaut 1, j'ai tout le temps des
IllegalMonitorStateException... Il dit qu'il n'est pas propriétaire du
monitor, alors qu'il est justement dans un block synchronized sur ce
moniteur...
Ai-je fait une erreur ? Est-ce interdit ne serait-ce que d'accéder à la
valeur d'un objet que l'on utilise comme moniteur ? Ou est-ce que la
milliseconde d'attente ne laisse justement même pas le temps au moniteur de
se mettre en place ?
Merci pour vos réponses !
wamli
je mettrais __monitor volatile qui empeche la duplication de la variable
dans l'article , Wamli à a écrit le 11/05/06 12:13 :
Bonjour,
J'ai un problème de synchronisation... J'ai un programme qui doit effectuer une action toute les 2 secondes, toutes les demi-seconde ou le plus souvent possible. Entre deux execution de l'action, il regarde s'il doit s'interrompre ou s'arreter. J'ai donc une methode de ce genre :
private String __monitor; private int time; // peut prendre une de ces valeurs : 1, 500, 2000
Un thread est dédié à l'execution de cette action. Un autre (dans mon cas celui qui gère les évenement de l'interface graphique) peut le controler. J'ai un bouton "stop" qui appelle la méthode suivante :
Aucune autre méthode ne met de verrou sur __monitor. Je teste certes sa valeur en dehors d'un block synchronized mais je n'appelle nulle part ailleurs wait() ou notify(). Lorsque time = 500 ou 2000, jamais de problème, mais lorsqu'il vaut 1, j'ai tout le temps des IllegalMonitorStateException... Il dit qu'il n'est pas propriétaire du monitor, alors qu'il est justement dans un block synchronized sur ce moniteur...
Ai-je fait une erreur ? Est-ce interdit ne serait-ce que d'accéder à la valeur d'un objet que l'on utilise comme moniteur ? Ou est-ce que la milliseconde d'attente ne laisse justement même pas le temps au moniteur de se mettre en place ?
Merci pour vos réponses !
wamli
je mettrais __monitor volatile qui empeche la duplication de la variable
(optimisation du compiler) dans chaque thread.
Insitu
Bonjour,
"Wamli" writes:
On ne sait jamais très bien avec Java ce qu'il fait lorsqu'on assigne des valeurs... mais vous devez avoir raison :
Si, si on sait très bien ce qu'il fait :-) Voir la spec de la JVM et du langage.
si on a
String test = "toto";
cela crée une structure "String" contenant toto et un test pointe sur cette structure
ensuite, si on fait
test = "titi",
au lieu de remplacer la structure toto par titi, il en crée une autre, et fait pointer test sur cette nouvelle structure, puis l'ancienne passe normalement au Garbage collector puisque rien d'autre ne pointe dessus... ok ok
Exactement. Ce qui implique donc que la variable appelée __monitor dans votre code ne référence plus le même objet, donc la synchronisation ne fonctionne plus ! Il faut modifier l'**état** de l'objet référencé par la variable et non pas la variable elle-même puisque la synchronisation modifie l'état du moniteur Java attaché à l'**objet**.
bon, je vais trouver une autre solution pour garder le même objet comme moniteur, même si sa valeur change.
C'est mieux :-) C'est même la seule manière de faire. Pour être efficace, un objet de type "énumération" (pas un vrai comme en java 5) avec un état état interne représenté par un champt privé et des méthodes qui vont bien serait adéquat, IMHO.
insitu.
Bonjour,
"Wamli" <wamli@web.de> writes:
On ne sait jamais très bien avec Java ce qu'il fait lorsqu'on assigne des
valeurs... mais vous devez avoir raison :
Si, si on sait très bien ce qu'il fait :-) Voir la spec de la JVM et
du langage.
si on a
String test = "toto";
cela crée une structure "String" contenant toto et un test pointe sur cette
structure
ensuite, si on fait
test = "titi",
au lieu de remplacer la structure toto par titi, il en crée une autre, et
fait pointer test sur cette nouvelle structure, puis l'ancienne passe
normalement au Garbage collector puisque rien d'autre ne pointe dessus... ok
ok
Exactement. Ce qui implique donc que la variable appelée __monitor
dans votre code ne référence plus le même objet, donc la
synchronisation ne fonctionne plus ! Il faut modifier l'**état** de
l'objet référencé par la variable et non pas la variable elle-même
puisque la synchronisation modifie l'état du moniteur Java attaché à
l'**objet**.
bon, je vais trouver une autre solution pour garder le même objet comme
moniteur, même si sa valeur change.
C'est mieux :-) C'est même la seule manière de faire. Pour être
efficace, un objet de type "énumération" (pas un vrai comme en java 5)
avec un état état interne représenté par un champt privé et des
méthodes qui vont bien serait adéquat, IMHO.
On ne sait jamais très bien avec Java ce qu'il fait lorsqu'on assigne des valeurs... mais vous devez avoir raison :
Si, si on sait très bien ce qu'il fait :-) Voir la spec de la JVM et du langage.
si on a
String test = "toto";
cela crée une structure "String" contenant toto et un test pointe sur cette structure
ensuite, si on fait
test = "titi",
au lieu de remplacer la structure toto par titi, il en crée une autre, et fait pointer test sur cette nouvelle structure, puis l'ancienne passe normalement au Garbage collector puisque rien d'autre ne pointe dessus... ok ok
Exactement. Ce qui implique donc que la variable appelée __monitor dans votre code ne référence plus le même objet, donc la synchronisation ne fonctionne plus ! Il faut modifier l'**état** de l'objet référencé par la variable et non pas la variable elle-même puisque la synchronisation modifie l'état du moniteur Java attaché à l'**objet**.
bon, je vais trouver une autre solution pour garder le même objet comme moniteur, même si sa valeur change.
C'est mieux :-) C'est même la seule manière de faire. Pour être efficace, un objet de type "énumération" (pas un vrai comme en java 5) avec un état état interne représenté par un champt privé et des méthodes qui vont bien serait adéquat, IMHO.
insitu.
Wamli
;--)
Oui évidemment mais qui a lu les spec du language de A à Z ?
quoique un de ces jours cela pourrait être utile...
"Insitu" wrote in message news:
Bonjour,
"Wamli" writes:
On ne sait jamais très bien avec Java ce qu'il fait lorsqu'on assigne des valeurs... mais vous devez avoir raison :
Si, si on sait très bien ce qu'il fait :-) Voir la spec de la JVM et du langage.
si on a
String test = "toto";
cela crée une structure "String" contenant toto et un test pointe sur cette structure
ensuite, si on fait
test = "titi",
au lieu de remplacer la structure toto par titi, il en crée une autre, et fait pointer test sur cette nouvelle structure, puis l'ancienne passe normalement au Garbage collector puisque rien d'autre ne pointe dessus... ok ok
Exactement. Ce qui implique donc que la variable appelée __monitor dans votre code ne référence plus le même objet, donc la synchronisation ne fonctionne plus ! Il faut modifier l'**état** de l'objet référencé par la variable et non pas la variable elle-même puisque la synchronisation modifie l'état du moniteur Java attaché à l'**objet**.
bon, je vais trouver une autre solution pour garder le même objet comme moniteur, même si sa valeur change.
C'est mieux :-) C'est même la seule manière de faire. Pour être efficace, un objet de type "énumération" (pas un vrai comme en java 5) avec un état état interne représenté par un champt privé et des méthodes qui vont bien serait adéquat, IMHO.
insitu.
;--)
Oui évidemment mais qui a lu les spec du language de A à Z ?
quoique un de ces jours cela pourrait être utile...
"Insitu" <insitu@achilleus.net> wrote in message
news:87hd3veama.fsf@oqube.com...
Bonjour,
"Wamli" <wamli@web.de> writes:
On ne sait jamais très bien avec Java ce qu'il fait lorsqu'on assigne des
valeurs... mais vous devez avoir raison :
Si, si on sait très bien ce qu'il fait :-) Voir la spec de la JVM et
du langage.
si on a
String test = "toto";
cela crée une structure "String" contenant toto et un test pointe sur
cette
structure
ensuite, si on fait
test = "titi",
au lieu de remplacer la structure toto par titi, il en crée une autre, et
fait pointer test sur cette nouvelle structure, puis l'ancienne passe
normalement au Garbage collector puisque rien d'autre ne pointe dessus...
ok
ok
Exactement. Ce qui implique donc que la variable appelée __monitor
dans votre code ne référence plus le même objet, donc la
synchronisation ne fonctionne plus ! Il faut modifier l'**état** de
l'objet référencé par la variable et non pas la variable elle-même
puisque la synchronisation modifie l'état du moniteur Java attaché à
l'**objet**.
bon, je vais trouver une autre solution pour garder le même objet comme
moniteur, même si sa valeur change.
C'est mieux :-) C'est même la seule manière de faire. Pour être
efficace, un objet de type "énumération" (pas un vrai comme en java 5)
avec un état état interne représenté par un champt privé et des
méthodes qui vont bien serait adéquat, IMHO.
Oui évidemment mais qui a lu les spec du language de A à Z ?
quoique un de ces jours cela pourrait être utile...
"Insitu" wrote in message news:
Bonjour,
"Wamli" writes:
On ne sait jamais très bien avec Java ce qu'il fait lorsqu'on assigne des valeurs... mais vous devez avoir raison :
Si, si on sait très bien ce qu'il fait :-) Voir la spec de la JVM et du langage.
si on a
String test = "toto";
cela crée une structure "String" contenant toto et un test pointe sur cette structure
ensuite, si on fait
test = "titi",
au lieu de remplacer la structure toto par titi, il en crée une autre, et fait pointer test sur cette nouvelle structure, puis l'ancienne passe normalement au Garbage collector puisque rien d'autre ne pointe dessus... ok ok
Exactement. Ce qui implique donc que la variable appelée __monitor dans votre code ne référence plus le même objet, donc la synchronisation ne fonctionne plus ! Il faut modifier l'**état** de l'objet référencé par la variable et non pas la variable elle-même puisque la synchronisation modifie l'état du moniteur Java attaché à l'**objet**.
bon, je vais trouver une autre solution pour garder le même objet comme moniteur, même si sa valeur change.
C'est mieux :-) C'est même la seule manière de faire. Pour être efficace, un objet de type "énumération" (pas un vrai comme en java 5) avec un état état interne représenté par un champt privé et des méthodes qui vont bien serait adéquat, IMHO.
insitu.
Cédric Olmanst
;--) Oui évidemment mais qui a lu les spec du language de A à Z ? quoique un de ces jours cela pourrait être utile...
Tous les bons codeurs en C ont lu la norme et la connaissent relativement bien. Et pourtant elle est bien tordue. Donc pourquoi pas... même s'il est vrai que le C évolue moins souvent.
;--)
Oui évidemment mais qui a lu les spec du language de A à Z ?
quoique un de ces jours cela pourrait être utile...
Tous les bons codeurs en C ont lu la norme et la connaissent
relativement bien. Et pourtant elle est bien tordue. Donc pourquoi
pas... même s'il est vrai que le C évolue moins souvent.
;--) Oui évidemment mais qui a lu les spec du language de A à Z ? quoique un de ces jours cela pourrait être utile...
Tous les bons codeurs en C ont lu la norme et la connaissent relativement bien. Et pourtant elle est bien tordue. Donc pourquoi pas... même s'il est vrai que le C évolue moins souvent.