Compréhension des Threads en Java
Résolu
QPPJabYou
Messages postés
5
Date d'inscription
Statut
Membre
Dernière intervention
-
QPPJabYou Messages postés 5 Date d'inscription Statut Membre Dernière intervention -
QPPJabYou Messages postés 5 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
voilà en fait j'aimerais qu'on puisse m'expliquer une chose.
J'ai lancé un petit programme permettant d'ajouter ainsi que de retirer l'argent dans un Thread. Il ajoutera 200 et retirera 200 également. Donc il devra à la fin faire 0.
Je vous présente ici mes bouts de codes :
-LA CLASSE COMPTE-
-LA CLASSE OPERATION-
-LA CLASSE MAIN-
-RESULTAT-
Operation 12 : 0
Operation 19 : 0
Operation 1 : 0
Operation 16 : 200
Operation 7 : 0
Operation 5 : 0
Operation 17 : 200
Operation 6 : 0
Operation 2 : 200
Operation 4 : 0
Operation 13 : 0
Operation 3 : 0
...
Comment se fait il que à certains moments je me retrouve avec 200 ou plus ? Alors que la méthode est en synchronised ?
Merci d'avance si une âme charitable puisse m'aider,
-QPPJabYou-
voilà en fait j'aimerais qu'on puisse m'expliquer une chose.
J'ai lancé un petit programme permettant d'ajouter ainsi que de retirer l'argent dans un Thread. Il ajoutera 200 et retirera 200 également. Donc il devra à la fin faire 0.
Je vous présente ici mes bouts de codes :
-LA CLASSE COMPTE-
public class Compte {
int somme = 0;
public synchronized void deposerArgent(int somme) {
this.somme += somme;
}
public synchronized void retirerArgent(int somme) {
this.somme -= somme;
}
public int getSomme(){
return somme;
}
}
-LA CLASSE OPERATION-
public class Operation extends Thread {
Compte compte;
public Operation(Compte compte) {
this.compte = compte;
}
@Override
public void run(){
while(true) {
compte.deposerArgent(200);
compte.retirerArgent(200);
System.out.println(this.getName() + " : " + compte.getSomme());
try {
sleep(3500);
} catch (InterruptedException e) {
System.out.println("Exception "+e);
}
}
}
}
-LA CLASSE MAIN-
public class Main {
public static void main(String[] args) {
final int MAXTHREADS = 20;
Operation operations[] = new Operation[20];
Compte compte = new Compte();
for(int i = 0; i < MAXTHREADS; ++i) {
operations[i] = new Operation(compte);
operations[i].setName("Operation "+i);
operations[i].start();
}
}
}
-RESULTAT-
Operation 12 : 0
Operation 19 : 0
Operation 1 : 0
Operation 16 : 200
Operation 7 : 0
Operation 5 : 0
Operation 17 : 200
Operation 6 : 0
Operation 2 : 200
Operation 4 : 0
Operation 13 : 0
Operation 3 : 0
...
Comment se fait il que à certains moments je me retrouve avec 200 ou plus ? Alors que la méthode est en synchronised ?
Merci d'avance si une âme charitable puisse m'aider,
-QPPJabYou-
A voir également:
- Compréhension des Threads en Java
- Waptrick java football - Télécharger - Jeux vidéo
- Jeux java itel - Télécharger - Jeux vidéo
- Eclipse java - Télécharger - Langages
- Java apk - Télécharger - Langages
- Waptrick java voiture - Télécharger - Jeux vidéo
2 réponses
Bonjour,
Pour résumer, tu as des threads qui font :
Voici un exemple d'exécution possible. Au départ, le compte est à 0 et on considère trois threads A, B et C. Avec en gras, les getSomme que tu affiches.
Thread A: deposerArgent => 200
Thread B: deposerArgent => 400
Thread C: deposerArgent => 600
Thread A: retirerArgent => 400
Thread A: getSomme => 400
Thread B: retirerArgent => 200
Thread B: getSomme => 200
Thread C: retirerArgent => 0
Thread C: getSomme => 0
Tu vas donc afficher 400, 200 et 0. Ce qui est vrai au moment de l'affichage. Ce n'est pas forcément représentatif de l'ensemble des opérations effectuées, mais le principal est sauf : à la fin tu auras bien toujours 0.
Pour résumer, tu as des threads qui font :
compte.deposerArgent(200); compte.retirerArgent(200); System.out.println(getName() + " : " + compte.getSomme());
Voici un exemple d'exécution possible. Au départ, le compte est à 0 et on considère trois threads A, B et C. Avec en gras, les getSomme que tu affiches.
Thread A: deposerArgent => 200
Thread B: deposerArgent => 400
Thread C: deposerArgent => 600
Thread A: retirerArgent => 400
Thread A: getSomme => 400
Thread B: retirerArgent => 200
Thread B: getSomme => 200
Thread C: retirerArgent => 0
Thread C: getSomme => 0
Tu vas donc afficher 400, 200 et 0. Ce qui est vrai au moment de l'affichage. Ce n'est pas forcément représentatif de l'ensemble des opérations effectuées, mais le principal est sauf : à la fin tu auras bien toujours 0.