Problème avec les threads

Résolu/Fermé
sedd1991 Messages postés 21 Date d'inscription samedi 3 septembre 2011 Statut Membre Dernière intervention 6 mai 2014 - 4 mai 2014 à 20:30
sedd1991 Messages postés 21 Date d'inscription samedi 3 septembre 2011 Statut Membre Dernière intervention 6 mai 2014 - 6 mai 2014 à 21:10
Bonsoir,
j'aimerais savoir comment faire pour que les threads de mon application java s'exécutent de manière parallèle, car j'ai remarqué qu'ils s'exécutaient séquentiellement.
J'utilise l'interface Runnable pour redéfinir la méthode run(), et je démarre les threads avec la méthode start().
Merci.
A voir également:

4 réponses

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
5 mai 2014 à 00:28
Bonsoir,

Il faudrait voir ton code pour voir ce qui pose problème, mais redéfinir run() et démarrer avec start() est bien la bonne manière de faire des Thread.

Remarque : au lieu d'implémenter un Runnable et le passer au constructeur du Thread, tu peux également étendre la classe Thread et redéfinir run de la même manière.
0
sedd1991 Messages postés 21 Date d'inscription samedi 3 septembre 2011 Statut Membre Dernière intervention 6 mai 2014 1
5 mai 2014 à 21:00
Bonsoir et merci pour la réponse,
voici la méthode run() que j'ai implémentée:

public class RunImpl implements Runnable {

private Compte compte;
private String name;
public RunImpl(Compte compte, String name){
this.compte=compte;
this.name=name;
}


public void run() {
for (int i=0; i<25; i++){
if(compte.getSolde()>0){
compte.retrait(2);
System.out.println("retrait effectué par :"+this.name);
}
}

}
}

Cette méthode décrémente le solde d'un compte en banque tant que celui-ci est positif.
Dans le main de mon programme, j'ai lancé deux threads qui décrémente le solde du compte en même temps:

public static void main(String[] args) {
Compte compte= new Compte();
Thread t1= new Thread(new RunImpl(compte,"user1"));
Thread t2= new Thread(new RunImpl(compte,"user2"));
t1.start();
t2.start();



}
En exécutant ce code je m'aperçois que tous les retraits sont effectués par "user1".
Merci pour les réponses.
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
5 mai 2014 à 21:24
Je viens de tester ton code et j'ai bien une alternance de user1 et user2.
Mais comme ta boucle est assez courte (seulement 25 tours) il est possible que le Thread de "user1" soit terminé avant que celui de "user2" ne commence.
Or si ton solde arrive à 0, le test
if(compte.getSolde()>0
empêche "user2" de retirer de l'argent et tu ne verras rien s'afficher. Peut-être devrais-tu rajouter un message dans ce cas.

if (compte.getSolde() > 0) {
    compte.retrait(2);
    System.out.println("retrait effectué par :" + this.name);
} else {
    System.out.println("il n'y a plus d'argent pour :" + this.name);
}
0
sedd1991 Messages postés 21 Date d'inscription samedi 3 septembre 2011 Statut Membre Dernière intervention 6 mai 2014 1
5 mai 2014 à 21:51
Comme tu me l'as suggéré, j'ai rajouté la condition
else {
System.out.println("il n'y a plus d'argent pour :" + this.name);
}
De plus, j'ai rallongé la boucle (500 tours), mais j'ai toujours le même problème:
le thread1 effectue ses 500 itérations sans être interrompu par le thread2 qui ne s'exécute qu'après la fin du premier thread (le déroulement est séquentiel).
J'ai pensé que le problème pouvait venir du fait que j'exécute le programme sur une machine à un seul processeur (un seul coeur) mais c'est un peu tiré par les cheveux.
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
5 mai 2014 à 22:10
Au contraire, le fait que ton ordinateur n'ait qu'un seul processeur augmente la séquentiabilité du programme. La JVM va alterner les deux threads mais sur la même machine, donc il va lui falloir du temps pour arrêter et redémarrer chacun des threads, du coup elle les laisse s'exécuter un petit moment avant de faire l'alternance et "user1" a terminé avant même que "user2" ne commence.

Pour forcer l'alternance des deux threads tu peux faire une petite pause à chaque tour de boucle, ça augmentera le temps de traitement de chaque thread et la JVM les alternera plus souvent.
Mais ce n'est qu'une bidouille pour mieux voir ce qui se passe, car en réalité ton code fonctionne déjà correctement.
0
sedd1991 Messages postés 21 Date d'inscription samedi 3 septembre 2011 Statut Membre Dernière intervention 6 mai 2014 1
6 mai 2014 à 21:10
Ok, merci pour la réponse.
0