Problèmes de variables communes à différents Threads

Problèmes de variables communes à différents Threads - Java - Programmation

Marsh Posté le 19-05-2006 à 08:49:25    

Des variables communes à différents Threads ne sont pas reconnues.
 
Voici un extrait d'une classe client.
L'entier identifiant est mis pour etre accessible partout dans la classe.
Le constructeur prend en paramètre un entier: tour
La fonction run contient des conditions qui s'execute en fonction du parametre tour
Dans un premier temps la classe cré un client RMI
Puis si on est dans tour avec pour valeur 0, une valeur est affectée à identifiant.
Si on est dans tour valeur 1 ou tour une autre valeur on essaie de récupérer la valeur d'identifiant, mais ce n'est pas celle qui a été affectée.  
 
 
public class clientEchec extends Thread{
 
 private int tour;
 private int identifiant;
 private boolean dep;
 
 
 public clientEchec(int tour){
  this.tour = tour;
  this.start();
 }
 
 
 public void run()
 {
  try{  
   String parole;
   int val;
   
   client = (EchecRMI) java.rmi.Naming.lookup("rmi://localhost/EchecRMI1" );
   if(tour==0){
     identifiant = client.lancerPartie();
   }else{
    while(true){
     if(tour==1){
      System.out.println("Valeur d identifiant "+identifiant);
     }else{
      System.out.println("Valeur d identifiant "+identifiant);
     }
    }
   }
   }
  }
  catch(Exception ex){  
  System.out.println("Valeur de EchecRMI1 " );  
  }
 }
 
public static void main(String args[])throws Exception{
   clientEchec clEch0 = new clientEchec(0);
   clientEchec clEch1 = new clientEchec(1);
   clientEchec clEch2 = new clientEchec(2);
 }
}

Message cité 1 fois
Message édité par marc90 le 19-05-2006 à 08:51:59
Reply

Marsh Posté le 19-05-2006 à 08:49:25   

Reply

Marsh Posté le 19-05-2006 à 10:10:34    

marc90 a écrit :

Des variables communes à différents Threads ne sont pas reconnues.

 



Bonjour !

 

Ben déjà, dans ton code, je ne vois aucune variable qui soit commune à différents Threads !...

 

Ensuite, que tu crées une instance de 'clientEchec' avec 1 ou 2 comme paramètre, la valeur d'identifiant n'est jamais initialisée (puisque 'tour' vaudra 1 ou 2, et pas 0).

 

Tu n'aurais pas oublié de mettre des données en static, par hasard ?

 

Reply

Marsh Posté le 19-05-2006 à 10:42:35    

Pourquoi tour ne pourrait pas valoir 0?
 
La variable commune est: private int identifiant

Reply

Marsh Posté le 19-05-2006 à 11:23:10    

bah non justement, elle n'est pas commune puisque pas static.

Reply

Marsh Posté le 19-05-2006 à 11:26:57    

Ha donc il faut mettre static int identifiant?

Reply

Marsh Posté le 19-05-2006 à 11:36:08    

Attention, là, il faut revoir tes bases en Java !
Quand tu fais une déclaration de variable 'int identifiant', cette variable est une donnée de l'objet, et chaque objet possède donc une variable 'identifiant' qui lui est propre et qui est distincte des autres.
Par contre, si tu fais 'static int identifiant', alors tu spécifies que la variable 'identifiant' est commune à tous les objets de la classe 'clientEchec'.  
Pour ce que tu veux faire, il faut que 'identifiant' et 'tour' soient static.

Reply

Marsh Posté le 19-05-2006 à 11:46:42    

Exact par contre comme tour est un parametre est-ce necessaire de lui mettre static?

Reply

Marsh Posté le 19-05-2006 à 12:58:55    

Non, car les paramètres ne peuvent pas être mis en static.
 
Et pour une meilleure clarté de ton code, tu devrais éviter d'avoir un paramètre 'tour' qui porte le même nom qu'une donnée membre de la classe. Ce n'est pas strictement interdit, mais ça peut induire en confusion.

Reply

Marsh Posté le 19-05-2006 à 13:17:11    

Faut il mettre aussi le client RMI en variable static?

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed