Threads

Résolu
cs_limalima Messages postés 124 Date d'inscription dimanche 31 août 2008 Statut Membre Dernière intervention 16 décembre 2010 - 25 nov. 2008 à 13:34
dvoraky Messages postés 744 Date d'inscription dimanche 1 avril 2007 Statut Membre Dernière intervention 9 mai 2010 - 25 nov. 2008 à 13:54
Bonjour,


j'ai une classe(T3) implementant l'interface runnable, cete classe utilise un objet d'une autre classe Compte1,
l'objectif est d'efectuer des retraits sur mon compte bancaire.
ça tourne, mais je ne comprends pas le fait que quand j'utilise deux threads qui opèrent sur un même objet de la classe Compte1, les retraits sont éffectués avec une certaine harmonie entre les deux threads(je veux dire que le dernier reprend le travail ou le premier la laissé!!)comme si j'avais rendu ma méthode retirer() syncronized, alors que ce n'ai pas le cas.

une autre question:
comme vous voyez sur le resultat, je n'ai pas les noms du threads que moi j'ai donné à mes threads, mais j'ai les noms :Thread-0, Thread-1 et je ne comprends pas !

voici mon code:
 La classe T3:











 





public










class


T3



implements


Runnable {




private


Compte1


c

;




private


String



nom


;




public


T3(Compte1 c,String nom) {




this


.


c

= c;




this


.


nom

=nom;

}




public







void


run() {




for


(



int


i=0;i<10;i++){




if


(


c

.getsolde()>0){



c

.retirer(4);System.




out


.println(


"retrait éffécué par "

+Thread. currentThread ().getName()+


"\nle solde courant: "

+


c

.affiche());}




else



System.






out


.println(


"Attention, vous êtes à découvert!"

);

}

}




public







static







void


main(String[] args) {

Compte1 c =




new


Compte1();

Thread t1 =




new


Thread(



new


T3(c,


"thread1"

));Thread t2 =




new


Thread(



new


T3(c,


"thread2"

));

t1.start();

t2.start();

}

}



//fin classe

T3

 




class


Compte1 {




private







int






solde

=100;




public







void


retirer(



int


n){




if


(n>


solde

)

System.




out


.println(


"Votre solde est insuffisant!"

);



solde

=


solde

-n;}




public







int


affiche(){




return






solde

;

}




public







int


getsolde(){




return






solde

;

}

}



//fin classe Comte1





 




Merci à vous de m'aider encore une fois


 


 


 




 


 




 

1 réponse

dvoraky Messages postés 744 Date d'inscription dimanche 1 avril 2007 Statut Membre Dernière intervention 9 mai 2010 8
25 nov. 2008 à 13:54
Salut,

C'est tout à fait normal ce que tu obtiens.

Tout d'abord, le nom du thread, tu affiches le nom du thread courant que tu n'as pas nommé, ce que tu passes en paramètres, c'est un nom de la classe T3, rien d'autre, si tu veux voir afficher le nom que tu as passé en paramètre, il te suffit de remplacer "Thread.getCurrentThread().getName()" par "nom" et voilà.

Ensuite, c'est tout à fait normal que les 2 threads soient en simultané, rien à voir avec un synchronized...
Regarde, à ton Thread T3, tu lui passes en paramètre la même instance de Compte1, donc forcément ils ont les mêmes attributs, enfin, le "c" est le même donc le solde est le même, tu vois?

Si tu veux exécuter le deuxième thread après et seulement après le premier thread, il te faut attendre l'exécution du premier thread, tout simplement en faisant un
t1.join();
qui a pour but d'attendre tant que le thread n'est pas terminé et ensuite, il continue le programme dans l'ordre.

Voilou

<hr width="100%" size="2" />
 C'est après des heures de codage que j'ai compris pourquoi les créateurs de Java ont choisi une tasse de café comme logo...
3
Rejoignez-nous