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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Février 2007
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 19
    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
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 26
    Par défaut
    Tu pourrais nous montrer ton code, et ce que tu obtiens a l'execution ?

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

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 229
    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.

  5. #5
    Membre émérite
    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
    Par défaut
    Verifie eventuellement si ta methode print() est static, ou si tu utilises le meme objet.

  6. #6
    Membre averti
    Inscrit en
    Février 2007
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 19
    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 Expert Avatar de maxf1
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 229
    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.

  8. #8
    Membre averti
    Inscrit en
    Février 2007
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 19
    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();
    	}
    }

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