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 :

Lancer plusieurs fois la meme thread


Sujet :

Concurrence et multi-thread Java

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Points : 137
    Points
    137
    Par défaut Lancer plusieurs fois la meme thread
    Bonjour,

    Je souhaite lancer par exemple 5 thread de suite, comment faire?

    J'ai cree ma classe qui derive de thread et la methode run mais lorsque je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for (int i = 0; i < 5; i++) {      			
          			new Clients().start();   
          			Thread.sleep(30);
     
          		}
    au lieu de me le lancer 5 fois , il me le lance des fois 7 fois , des fois 9 fois , c'est aleatoire.

    Merci de votre aide.

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Points : 137
    Points
    137
    Par défaut
    J'ai tenté ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    for (int i = 0; i < 10; i++) {
          			Clients client = new Clients();
          			Thread t = new Thread(client);
          			t.start();
     
          		  try {
          		      t.join();
          		    } catch (InterruptedException e) {
          		      e.printStackTrace();
          		    }
          		}
    C'est un peu mieux, parfois il m'en fait 11 et parfois 10

    quelqu'un a une idee pour avoir exactement le nombre de thread que je veux ?

    Merci de votre aide.

  3. #3
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par andromeda Voir le message
    au lieu de me le lancer 5 fois , il me le lance des fois 7 fois , des fois 9 fois , c'est aleatoire.
    On pourrait voir le code de ta classe Clients ?

    a++

    PS : dans le deuxième code, à quoi ca sert de lancer un thread si c'est pour faire un join() derrière ???

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Points : 137
    Points
    137
    Par défaut
    le code n'a rien a voir avec ca je pense, c'est au niveau du thread.
    meme si le thread a un code minimum, pour afficher toto ca fait la meme chose.

    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
    28
    29
    30
     
    import java.io.IOException;
    import java.net.Socket;
    import java.util.Date;
     
    import kConst.Constantes;
     
    public class Clients extends Thread {
    	private Socket client;  	
     
    	public Clients(){
            try{                    
    	       	System.out.println(new Date()+ "==> Tentative de connexion au serveur "+ Constantes.host + " port "+ kConst.Constantes.PORT);
    	       	client = new Socket(Constantes.host, Constantes.PORT);
    	    }
          	catch ( IOException e )
    	    {
    	    	System.out.println(new Date()+ "==> Impossible de se connecter au serveur ");	       		
    	    }      		
     
        } // !constructeur
     
    	public void run(){
    		try{
     
    	    	TrameVehicule tramevehicule = new TrameVehicule(this.client);	    	
     
    	    }catch (Exception e){System.err.println(e);}
    	  }// ! run() method
    }// ! Clients class
    Quelqu'un a deja lance plusieurs fois la meme thread ?

  5. #5
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par andromeda Voir le message
    le code n'a rien a voir avec ca je pense, c'est au niveau du thread.
    meme si le thread a un code minimum, pour afficher toto ca fait la meme chose.
    Et bien fournit nous un code minimum où le problème se reproduit, que l'on puisse tester de notre coté...

    Car là il n'y a pas de raison que les threads s'exécutent plusieurs fois...

    a++

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Points : 137
    Points
    137
    Par défaut
    je lai mis plus haut

    a la place de
    TrameVehicule tramevehicule = new TrameVehicule(this.client);
    il faut mettre
    System.out.println("toto");

    Merci.

  7. #7
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par andromeda Voir le message
    a la place de
    TrameVehicule tramevehicule = new TrameVehicule(this.client);
    il faut mettre
    System.out.println("toto");
    C'est à dire quelque chose comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class Clients extends Thread {
     
    	public void run() {
    		System.out.println("toto");
    	}
     
    	public static void main(String[] args) throws InterruptedException {
    		for (int i = 0; i < 5; i++) {      			
      			new Clients().start();   
      			Thread.sleep(30);
      		}
    	}
    }
    Ce qui me donne comme résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    toto
    toto
    toto
    toto
    toto
    Bref tout est normal !

    Bon courage...

    a++

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Points : 137
    Points
    137
    Par défaut
    Ce n'est pas le meme code que toi que j'ai; moi il me l'affiche neuf fois.

    moi j'appel clients dans ma classe principal en creant la thread

    code principal:

    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
     
    public class SimulatorKuantic {
     
        public static void main(String[] args) {     
     
          	try {      		      	
          		for (int i = 0; i < 10; i++) {
          			Clients client = new Clients();
          			Thread t = new Thread(client);
          			t.start();
     
          		  try {
          		      t.join();
          		    } catch (InterruptedException e) {
          		      e.printStackTrace();
          		    }
          		}
     
          	}  catch (Exception e){System.out.println("SimulatorKuantic main : "+e);}	 
     
          	System.out.println("Traitement terminé");
    	}
     
    }
    et la classe 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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    import java.io.IOException;
    import java.net.Socket;
    import java.util.Date;
     
    import kConst.Constantes;
     
    public class Clients extends Thread {
    	private Socket client;  	
     
    	public Clients(){
            try{                    
    	       	System.out.println(new Date()+ "==> Tentative de connexion au serveur "+ Constantes.hostGPS + " port "+ kConst.Constantes.PORT);
    	       	client = new Socket(Constantes.hostGPS, Constantes.PORT);
    	    }
          	catch ( IOException e )
    	    {
    	    	System.out.println(new Date()+ "==> Impossible de se connecter au serveur GPS ");	       		
    	    }      		
     
        } // !constructeur
     
    	public void run(){
    		try{
     
    	    	//TrameVehicule tramevehicule = new TrameVehicule(this.client);
    			System.out.println("Toto");
     
    	    }catch (Exception e){System.err.println(e);}
    	  }// ! run() method
    }// ! Clients class
    Ou est le mprobleme ?
    tu as mis le main dans la thread ?

    Merci de votre aide.

  9. #9
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par andromeda Voir le message
    Ce n'est pas le meme code que toi que j'ai;
    C'est un peu pour cela que je te demandais ton code exact...

    Citation Envoyé par andromeda Voir le message
    moi il me l'affiche neuf fois.
    Donc il en manque un ! Alors que dans la description du problème tu disais avoir plus de thread que ce que tu n'en lancais...

    As-tu une exception dans tes traces qui pourrait expliquer qu'un des threads ne s'exécute pas ?



    Sinon je réitère ma question : à quoi ca sert de lancer un thread si c'est pour faire un join() derrière ???

    Et pourquoi fais tu new Thread(client) alors que client est déjà un thread ???

    a++

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Points : 137
    Points
    137
    Par défaut
    en fait le probleme , d'apres ce que j'ai pu constate , les thread se lance un peu au hasard,

    par exemple au lieu de lancer les thread dans l'ordre 1,2,3,4,5 il les lance
    dans un ordre 1,3,5,4

    il faudrait que je puisse dire a java de les executer une par une en attendant que la precedente se termine.

    est ce que c'est possible de lui dire ca ?

    lancement de la thread 1
    quand thtread1 se termine, lancer thread 2, etc ... jusqua la 5

    Merci de votre aide.

  11. #11
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par andromeda Voir le message
    lancement de la thread 1
    quand thtread1 se termine, lancer thread 2, etc ... jusqua la 5
    C'est du séquentiel !!! Pourquoi faire des threads dans ce cas là ?

    a++

  12. #12
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Points : 631
    Points
    631
    Par défaut
    Je te dirais bien de regarder du coté des ThreadPoolExecutor mais vu comme tu traites les thread, ça risque de te compliquer la tache plus qu'autre chose.

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Points : 137
    Points
    137
    Par défaut
    en fait c'est pour faire un tests de charge, c'est a dire lancer des milliers de thread qui se connecte a un serveur.

    mais en mettant le joint ca a l'air de marcher, je suis oblige de mettre des joint pour eviter des effet de bord du a la connection au serveur:

    ci-joint mon code:

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    import java.io.IOException;
    import java.net.Socket;
    import java.util.Date;
     
    import kConst.Constantes;
     
     
    public class SimulatorKuantic extends Thread {
     
    	private Socket client;
     
    	public void run(){		
     
    		//Temporisation de 30 millisecond
    		try {
    			Thread.sleep(30); // ms
    		} catch (InterruptedException e) {
    			System.out.println("Thread.sleep probleme!\n");
    			return;
    		}
     
    		//Connexion au serveur
    		try{                    
    	       	System.out.println(new Date()+ "==> Tentative de connexion au serveur "+ Constantes.hostGPS + " port "+ kConst.Constantes.PORT);
    	       	client = new Socket(Constantes.hostGPS, Constantes.PORT);
    	    }
          	catch ( IOException e )
    	    {
    	    	System.out.println(new Date()+ "==> Impossible de se connecter au serveur GPS ");	       		
    	    }   
     
          	//Envoie de la trame au serveur
    		try{	        		      		      	
    	    	TrameVehicule tramevehicule = new TrameVehicule(this.client);			
     
    	    }catch (Exception e){System.err.println(e);}
    	 }// ! run() method
     
        public static void main(String[] args)throws InterruptedException {     
     
          	for (int i = 0; i < 9; i++) {
          		System.out.println("Tache "+i+" lancé");
          		Thread t = new SimulatorKuantic();
          		t.start();
          		t.join();
          	} 
          	System.out.println("Traitement terminé");
    	}
     
    }
    a quoi sert exactement les ThreadPoolExecutor ?

    Merci.

  14. #14
    Membre éclairé
    Avatar de divxdede
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    525
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2004
    Messages : 525
    Points : 844
    Points
    844
    Par défaut
    Citation Envoyé par andromeda Voir le message
    a quoi sert exactement les ThreadPoolExecutor ?
    Les Executor sont des pool de threads executant à la demande des operations (Runnable). Selon l'implémentation de l'executor celui-ci va adpoter une stratégie pour l'usage de ces threads.

  15. #15
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par andromeda Voir le message
    mais en mettant le joint ca a l'air de marcher, je suis oblige de mettre des joint pour eviter des effet de bord du a la connection au serveur:
    Mais en mettant un join() tu effectues chaque threads à la fin du précédent, et donc en séquentiel : bref tu n'as pas besoin de thread et une simple boucle serait amplement suffisante !

    Les threads permettent de faire des traitements en parallèle...

    a++

  16. #16
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Points : 631
    Points
    631
    Par défaut
    Citation Envoyé par andromeda Voir le message
    a quoi sert exactement les ThreadPoolExecutor ?
    L'idée, quand on te donne une piste sur un truc qui pourrait t'aider, c'est d'essayer au moins de regarder la doc correspondante.

  17. #17
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Points : 137
    Points
    137
    Par défaut
    oui je regarderais, mais dans un premier temps je l'utiliserais pas , c'etait a titre d'information.

    Pour l'avant post precedent:

    j'avais teste avec une boucle et ca ne marchait pas, car je me conecte sur un serveur.

    et dans la boucle ca plantait, ca mettait erreur socketclosed et c'etait parceque il fallait utiliser des thread pour attendre que la sequence se finisse correctement
    c'est a dire , connexion, message entre client serveur, puis deconnexion, avec une boucle ca ne marchera jamais tu peux faire le test.

    c'est un traitement special que je fait, c'est le seul moyen, la preuve avec la thread ca marche meme si c'est sequentiel.

  18. #18
    Membre éclairé
    Avatar de divxdede
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    525
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2004
    Messages : 525
    Points : 844
    Points
    844
    Par défaut
    Citation Envoyé par andromeda Voir le message
    oui je regarderais, mais dans un premier temps je l'utiliserais pas , c'etait a titre d'information.

    Pour l'avant post precedent:

    j'avais teste avec une boucle et ca ne marchait pas, car je me conecte sur un serveur.

    et dans la boucle ca plantait, ca mettait erreur socketclosed et c'etait parceque il fallait utiliser des thread pour attendre que la sequence se finisse correctement
    c'est a dire , connexion, message entre client serveur, puis deconnexion, avec une boucle ca ne marchera jamais tu peux faire le test.

    c'est un traitement special que je fait, c'est le seul moyen, la preuve avec la thread ca marche meme si c'est sequentiel.
    Ce qu'essai de te dire adiGuba, c'est que si tu lances ta procédure sequentiellement, ne t'embettes pas a créer des threads, effectue une simple boucle (for,while) et ce sera équivalent.

  19. #19
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Points : 137
    Points
    137
    Par défaut
    ben je l'ai deja fait mais ca ne fonctionne pas car plusieurs client a la suite des autre veulent se connecte en meme temps et sa plante, alors qu'avec une thread les connexions sont faite separement donc ca marche nikel, meme si c'est sequentiel, le fait que ce soit dans un thread il n'y a pas de conflit car il ne se connecte pas en meme temps.

  20. #20
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par andromeda Voir le message
    car plusieurs client a la suite des autre veulent se connecte en meme temps et sa plante
    Il n'y a pas comme une contradiction dans cette phrase ???

    a++

Discussions similaires

  1. Imprimer plusieur fois la meme page d'un etat
    Par Renardo dans le forum Access
    Réponses: 2
    Dernier message: 22/04/2006, 17h14
  2. Formulaire regroupant plusieur fois le meme sous-formulaire?
    Par Goldenduck4000 dans le forum Access
    Réponses: 2
    Dernier message: 18/04/2006, 15h57
  3. Réponses: 2
    Dernier message: 15/03/2006, 18h48
  4. Réponses: 23
    Dernier message: 08/02/2006, 09h15
  5. Réponses: 11
    Dernier message: 02/02/2005, 12h52

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