cs_limalima
Messages postés124Date d'inscriptiondimanche 31 août 2008StatutMembreDernière intervention16 décembre 2010
-
5 avril 2009 à 19:55
uhrand
Messages postés491Date d'inscriptionsamedi 20 mai 2006StatutMembreDernière intervention15 juillet 2012
-
6 avril 2009 à 21:49
Bonjour à tous,
j'ai un petit programme qui consiste à retirer ou déposer une certaine somme d'argent sur un compte en banque
je ne peux retirer que si le solde est positif.
alors j'ai essayé d'utiliser la méthode wait() comme ceci:
tant que le solde est négatif, alors wait()
mais je ne sait pas comment introduire la méthode notify() et je ne comrends pas comment l'utiliser en fait, alors si quelqu'un parmi vous vous peut m'expliquer à quoi elle sert , autre chose:dans mon code, je met le solde initial à -10, et j'essai de retirer 2 et de deposer 2 dix fois de suite,
logiquement je devrai avoir 10 incrémentation de 2 et le solde sera donc 0, mais ce n'est pas ce que la console affiche:
etat du thread t NEW
etat du thread t RUNNABLE (cette partie en bleue devrai s'afficheé à la fin!!!!!!!!!!!!!)
priorité de : Thread-1:5
priorité de: Thread-0:5
priorite du thread principale: 5
solde final: -10
Solde après le dépot: -8
Solde après le dépot: -6
autre question: comme j'ai mis t.join() et t2.join() alors l'affichage du thread principale(la methode main()) devrai s'afficher à la fin sur ma console, ce qui n'est pas le cas!!, ?
merci de me répondre
voici le code:.
package
Theread;
import
java.util.PriorityQueue;
public
class RunImpl
implements Runnable {
private CompteEnBanque
cb;
private String
name;
public RunImpl(CompteEnBanque cb, String name){
this.
cb = cb;
this .
name = name;}
public
void run(){
for(
int i = 0; i<10; i++){
cb.deposerArgent(2);
cb.retraitArgent(2);
}
}
public
static void main(String[] args) {
CompteEnBanque cb =
new CompteEnBanque();
Thread t2 =
new Thread(
new RunImpl(cb,
"ZérO"));Thread t =
new Thread(
new RunImpl(cb,
"Cysboy"));
try {t2.join();
t.join();
}
catch (InterruptedException e1) {
// TODO Auto-generated catch blocke1.printStackTrace();
}
System.
out .println(
"etat du thread t "+t.getState());t.start();
System.
out.println(
"etat du thread t "+t.getState());t2.start();
System.
out.println(
"priorité de : "+ t.getName()+
":"+t.getPriority());System.
out.println(
"priorité de: "+ t2.getName()+
":"+t2.getPriority()); System.
out.println(
"priorite du thread principale: "+ Thread.currentThread().getPriority());
System.
out.println(
"solde final: "+cb.getSolde());
}
}
package
Theread;
public
class CompteEnBanque {
private static int solde = -10;
public
int getSolde(){
return this.
solde ;}
public synchronized void retraitArgent(
int retrait){
while(
<italique>solde< = 0){
try {wait();
}
catch (InterruptedException e) {
// TODO Auto-generated catch blocke.printStackTrace();
System.
out .println(
"j'atends plus!");}
}
solde =
solde - retrait;
System.
out.println(
"Solde après le retrait: " +
solde);
notify();
}
public
synchronized void deposerArgent(
int montant){
solde =
solde+montant;System.
out.println(
"Solde après le dépot: " +
solde);notify();
uhrand
Messages postés491Date d'inscriptionsamedi 20 mai 2006StatutMembreDernière intervention15 juillet 20129 6 avril 2009 à 21:49
Un "join" n'a de sens que si le Thread en question est déja démarré!
J'ai modifié un peu le scénario: le premier Thread ("Zero") veut faire un retrait d'argent pendant que l'autre Thread ("Cysboy") dépose de l'argent. Lorsque "Cysboy" a déposé assez d'argent, "Zero" réussi effectivement son retrait:
public class RunImpl implements Runnable {
private CompteEnBanque cb;
private String name;
public RunImpl(CompteEnBanque cb, String name) {
this.cb = cb;
this.name = name;
}
public void run() {
if (name.equalsIgnoreCase("zero")) {
cb.retraitArgent(2);
} else {
for (int i = 0; i < 10; i++) {
cb.deposerArgent(2);
}
}
}
public static void main(String[] args) {
CompteEnBanque cb = new CompteEnBanque();
Thread t2 = new Thread(new RunImpl(cb, "Zero"));
Thread t = new Thread(new RunImpl(cb, "Cysboy"));
System.out.println("etat du thread t " + t.getState());
t.start();
System.out.println("etat du thread t " + t.getState());
t2.start();
try {
t2.join();
t.join();
} catch (InterruptedException e1) {
e1.printStackTrace();
}
System.out.println("priorite de : " + t.getName() + ":" + t.getPriority());
System.out.println("priorite de: " + t2.getName() + ":" + t2.getPriority());
System.out.println("priorite du thread principale: " + Thread.currentThread().getPriority());
System.out.println("solde final: " + cb.getSolde());
}
}
class CompteEnBanque {
private static int solde = -10;
public int getSolde() {
return CompteEnBanque.solde;
}
public synchronized void retraitArgent(int retrait) {
while (solde <= 0) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
System.out.println("j'atends plus!");
}
}
solde = solde - retrait;
System.out.println("Solde apres le retrait: " + solde);
notify();
}
public synchronized void deposerArgent(int montant) {
solde = solde + montant;
System.out.println("Solde apres le depot: " + solde);
notify();
}
}