Thread

cs_limalima Messages postés 124 Date d'inscription dimanche 31 août 2008 Statut Membre Dernière intervention 16 décembre 2010 - 5 avril 2009 à 19:55
uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 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();

}

}

1 réponse

uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 9
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();
    }
}
0
Rejoignez-nous