partager de variable entre plusieurs threads

partager de variable entre plusieurs threads - Java - Programmation

Marsh Posté le 25-02-2008 à 19:36:44    

Bonjour a tous,
j'ai fais un programme java client/serveur :
il y a un serveur qui acceuille les clients, les clients emettent des demandes, qui sont alors stockées dans une file (elle meme stockées sur le serveur Accueil)
et il y a egalement un serveur Traitement qui se charge de consulter la file de demande et de traiter les demandes les uns apres les autres.
Le serveur Traitement doit donc accéder a la file de Demandes qui est sur le serveur Acceuil.
 
Cepandant j'ai un probleme : pour tester j'ai voulu faire une boucle sur le serveur Traitement qui affiche toutes les 10 secondes la taille de la file de la maniere suivante :
while(true){
  int i =Accueil.fileDemandes.taille();
  Thread.sleep(15000);
  System.out.println(i);
}
cepandant cela m'affiche toujours 0 alors que je suis sur que mon serveur Acceuil push bien dans la file lorsqu'un client emet une demande :
Accueil.fileDemandes.push(d);
 
pouvez vous m'aider s'il vous plait ?
la file est en public static sur le serveur Acceuil

Reply

Marsh Posté le 25-02-2008 à 19:36:44   

Reply

Marsh Posté le 26-02-2008 à 12:01:59    

il faut que ta collection soit synchronisée
 
pour la création :

Code :
  1. Accueil.fileDemandes = Collections.synchronizedCollection(new Collection());


 
et pour y accéder, tu met un verrou, au lieu de "int i =Accueil.fileDemandes.taille();", tu met :

Code :
  1. int i;
  2. synchronized(Accueil.fileDemandes) {
  3.    i = Accueil.fileDemandes.size();
  4. }

Reply

Marsh Posté le 26-02-2008 à 12:12:02    

mauvais exemple avec size(), justement tu ne fais pas ça, puisque la collection est synchronized. Par contre, pour faire un ensemble d'opérations liées, tu fais un bloc synchronized


Message édité par Taz le 26-02-2008 à 12:12:49
Reply

Marsh Posté le 26-02-2008 à 14:02:42    

mon push et ma methode taille sont comme suit :
 
 public synchronized int taille()
 {  
  return lesObjets.size();
 }  
 
 public synchronized void push(E unObjet)
 {
  lesObjets.add(unObjet);
 }
 
je ne comprend pas, pourtant elles sont synchronized :(  
je suis vraiment "a la ramasse" :/

Reply

Sujets relatifs:

Leave a Replay

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