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 :
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);
     }
}
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 ) .

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 .

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);
     }
}
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 .
J'ai pensé à la méthode notify() qui "r"veilleré" mon Thread , donc j'ai essayé ça :

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();
     }
}
Mais lorsque notify() est appelé j'ai l'exception : java.lang.IllegalMonitorStateException .

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!