IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Concurrence et multi-thread Java Discussion :

Problème avec des threads


Sujet :

Concurrence et multi-thread Java

  1. #1
    Membre à l'essai
    Inscrit en
    Février 2007
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 19
    Points : 10
    Points
    10
    Par défaut Problème avec des threads
    Voila je crée plusieurs threads, dans le run je fais un sleep(une_valeur), puis j'appelle une méthode print() qui affiche 2-3 lignes d'informations, le problème c'est que dans 2 de mes processus je dois avoir la même valeur du paramètre du sleep, après le lancement des threads j'ai l'affichage de ces 2 processus qui est entremélé pourtant ma méthode print() est bien définie synchronized .



    Merci de votre aide

  2. #2
    Nouveau membre du Club
    Inscrit en
    Février 2007
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 26
    Points : 37
    Points
    37
    Par défaut
    Tu pourrais nous montrer ton code, et ce que tu obtiens a l'execution ?

  3. #3
    Nouveau membre du Club
    Inscrit en
    Août 2003
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 32
    Points : 32
    Points
    32
    Par défaut
    c'est bien l'ensemble des print qui sont synchronisés ?

  4. #4
    Membre expérimenté Avatar de maxf1
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 229
    Points : 1 371
    Points
    1 371
    Par défaut
    Pourquoi faire un sleep de tes threads. Tu as autant mettre le sleep dans ton print. Si la methode est synchronized si un thread tombe dans le sleep les autres attendront aussi.

    Une solution toute bete : ton print est bien synchro mais ta methode est traité tellement rapidement que eclipse n'arrive pas à suivre et t'affiche ton print entremelé. D'ou un sleep dans ton print comme ca tu es sur que le print à le temps de s'afficher avec qu'un autre puisse aller dedans et faire un autre print.
    Une solution a été apporté pour résoudre votre problème alors vous aussi faites en profitez les autres grâce au tag qui se trouve tout en bas de la page....

    Merci de ne pas utiliser les messages privés pour un problème sauf si je vous l'ai explicitement demandé.

    -- Maxf1 --

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Points : 675
    Points
    675
    Par défaut
    Verifie eventuellement si ta methode print() est static, ou si tu utilises le meme objet.

  6. #6
    Membre à l'essai
    Inscrit en
    Février 2007
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 19
    Points : 10
    Points
    10
    Par défaut
    la solution du sleep dans le print ne change rien, je posterai mon code quand je rentrerai des cours ce soir, en tout cas merci ...

  7. #7
    Membre expérimenté Avatar de maxf1
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 229
    Points : 1 371
    Points
    1 371
    Par défaut
    Si le sleep dans le print ne marche pas alors tu n'as pas du bien synchroniser ta méthode.
    On attend ton code car sans c'est pas possible de t'aiguiller plus.
    Une solution a été apporté pour résoudre votre problème alors vous aussi faites en profitez les autres grâce au tag qui se trouve tout en bas de la page....

    Merci de ne pas utiliser les messages privés pour un problème sauf si je vous l'ai explicitement demandé.

    -- Maxf1 --

  8. #8
    Membre à l'essai
    Inscrit en
    Février 2007
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 19
    Points : 10
    Points
    10
    Par défaut
    Voila j'ai 2 Mains :

    Un serveur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    import java.net.*;
    import java.io.*;
     
    public class MainServer {
    	public static void main(String args[]){
    		try{
    			ServerSocket ss=new ServerSocket(12345);
    			System.out.println("en attente...");
    			ss.accept();
    			System.out.println("client connecte...\n");
    			new MapProcessus(10).start();
    		}catch(IOException e){}
    	}
    }
    un client :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    import java.net.*;
    import java.io.*;
     
    public class MainClient {
    	public static void main(String args[]){
    		try{
    			new Socket("localhost",12345);
    			System.out.println("connecte\n");
    			new MapProcessus(10).start();
    		}catch(IOException e){
     
    		}
    	}
    }
    une map de processus:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    import java.util.TreeMap;
    import java.util.Iterator;
     
    public class MapProcessus extends TreeMap<Integer,Processus>{
    	private static final long serialVersionUID=1L;
     
    	public MapProcessus(int N){
    		super();
     
    		for(int i=1;i<=N;i++){
    			int debut=(int)(Math.random()*10);
    			if(debut<=5)
    				put(i,new ProcessusType1(i,i*100,debut));
    			else
    				put(i,new ProcessusType2(i));
    		}
    	}
     
    	public void start(){
    		Iterator it=keySet().iterator();
    		while(it.hasNext()){
    			Integer i=(Integer)it.next();
    			Processus p=get(i);
    			p.start();
    		}
    	}
    }

    classe processus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    abstract public class Processus extends Thread{
    	protected int id;
     
    	synchronized public void print(){
    		System.out.println("Je suis le Processus "+id);
    	}
     
    	abstract public void run();
    }
    processus de type 1 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    public class ProcessusType1 extends Processus{
    	private double val;
    	private int debut;
     
    	public ProcessusType1(int id,double val,int debut){
    		this.id=id;
    		this.val=val;
    		this.debut=debut;
    	}
     
    	synchronized public void print(){
    		super.print();
    		System.out.println(id+" : Je suis du type 1");
    		System.out.println(id+" : val --> "+val);
    		System.out.println(id+" : debut --> "+debut);
    		System.out.println("");
    	}
     
    	public void run(){
    		try{
    			sleep(debut*1000);
    			print();
    		}catch(InterruptedException e){
     
    		}
    	}
    }
    processus de type 2 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    public class ProcessusType2 extends Processus{
    	public ProcessusType2(int id){
    		this.id=id;
    	}
     
    	synchronized public void print(){
    		super.print();
    		System.out.println("Je suis du type 2");
    		System.out.println("");
    	}
     
    	public void run(){
    		print();
    	}
    }

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Points : 675
    Points
    675
    Par défaut
    Une methode déclarée synchronized verrouille l'acces à la methode si tu l'appelles avec la meme instance.

    Par exemple, si tu as deux threads 1 et 2, qui utilise le meme objet créé a partir de la classe ProcessusType1, la methode print appelée dans un thread sera bloquante pour l'autre.

    Tu n'es pas dans ce cas : chaque thread a sa propre instance.

    Une solution possible consisterait à rendre ta methode static (avec eventuellement en parametre une instance). Le verrou ne se fait plus sur l'instance mais sur la classe, qui, elle, est partagée entre les differents threads.

    Je t'invite également à lire (ou sans doute relire) de la documentation sur ce sujet. Tu auras une vision bien plus claire de ce qui se passe. Je suis malheureusement trop nouveau sur ce site pour t'indiquer un lien, mais je j'imagine qu'il doit y avoir ce qu'il faut.

Discussions similaires

  1. Problème de modification des paramètres avec des threads synchrones
    Par manelhaj dans le forum Threads & Processus
    Réponses: 5
    Dernier message: 22/09/2013, 11h03
  2. Problème avec des composants non déclarés
    Par vbcasimir dans le forum Bases de données
    Réponses: 1
    Dernier message: 20/01/2005, 11h17
  3. Réponses: 5
    Dernier message: 19/08/2004, 11h11
  4. [STRUTS] Problème avec des ActionForm
    Par zarbydigital dans le forum Struts 1
    Réponses: 2
    Dernier message: 29/03/2004, 13h49
  5. Problèmes avec des vues
    Par dady dans le forum MFC
    Réponses: 22
    Dernier message: 09/01/2004, 16h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo