Bonsoir ,
J'ai un programme qui doit attendre un évenment qui se passe pas dans sa classe (une reception de message par socket , qu'un autre thread s'occupe ) Une fois que le message est reçu , pour communiquer avec mon autre thread j'ai pensé à faire un attribu String message initialisé à null et lorsque que je reçois mon message dans mon autre classe je met cette attribu à la valeur reçu (différente de null) . Et dans le thread pour attendre je fais while(this.message==null){} , voici le code :
J'ai fait tout les vérification possible pour vous dire que l'attribut this.message se change trés bien (test dans la méthode setMessage() , mais apparemment le run() du Thread n'en prend pas compte dans la boucle while ) .
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 public class Match implements Runnable{ private String message=null; //...constructeur public void run(){ System.out.println("attente1"); while(this.message==null){} System.out.println("youpi"); } public void setMessage(String m) { this.message=m; } } //Et dans l'autre thread : public class Autre implements Runnable{ public void run(){ ................................ if(...){ match.setMessage(xxx); } }
Bon ensuite , dans le cadre de mon programme il me fallait un Timer , c'est à dire au bout de x secondes on regarde si on a reçu le message ou pas .
Ce code a bien marché , mais à partir de là mon Thread va forcémment attendre xxTemps et si on reçoit le message avant on est marron , il faut atendre .
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 public class Match implements Runnable{ private String message=null; //...constructeur public void run(){ System.out.println("attente1"); Thread.sleep(xtemps); if(this.message!=null) System.out.println("youpi"); else System.out.println("Pas dans les temps"); } public void setMessage(String m) { this.message=m; } } //Et dans l'autre thread : public class Autre implements Runnable{ public void run(){ ................................ if(...){ match.setMessage(xxx); } }
J'ai pensé à la méthode notify() qui "r"veilleré" mon Thread , donc j'ai essayé ça :
Mais lorsque notify() est appelé j'ai l'exception : java.lang.IllegalMonitorStateException .
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 public class Match extends Thread{ private String message=null; //...constructeur public void run(){ System.out.println("attente1"); Thread.sleep(xtemps); if(this.message!=null) System.out.println("youpi"); else System.out.println("Pas dans les temps"); } public void setMessage(String m) { this.message=m; } } //Et dans l'autre thread : public class Autre implements Runnable{ public void run(){ ................................ if(...){ match.setMessage(xxx); match.notify(); } }
Du coup j'ai cherché un peu sur le net , j'ai essayé d'ajouter le mot clé synchronized à mes méthodes mais en vain .
Si vous avez des solutions à me proposer , surtout pour le second prblème (c'est à dire avec l'utilisation du Time) ! Et sinon au problème initial !
Meci beaucoup!
Partager