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 :

[Threads et interface] le thread bloque tout


Sujet :

Concurrence et multi-thread Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 95
    Points : 47
    Points
    47
    Par défaut [Threads et interface] le thread bloque tout
    Bonjour tout le monde,

    Je rencontre actuellement un problème avec un thread, quand j'appuie sur le bouton qui a comme action performed de lancer un boucle infinie alors toutes l application reste bloqué(boucle infinie d'écoute de connection de client), après m'être renseigné un peu j'ai vu qu'il existait une certaine méthode pour éviter ce genre de problème mais je ne l'ai pas compris.

    Quelqu'un pourrait il me l'expliquer ?

    Merci

  2. #2
    Membre à l'essai
    Inscrit en
    Octobre 2004
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 29
    Points : 23
    Points
    23
    Par défaut
    Tu dois étendre ta classe qui fait la boucle infinie de la classe Thread

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public MyClass extends Thread{
     
     
    public void run(){
      while(true){
           .... ecouter les sockets
       }
    }
     
    }

    Et pour lancer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    new MyClass().start();
    voila en espérant avoir répondu à ta question

  3. #3
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut Re: [Threads et interface] le thread bloque tout
    Citation Envoyé par meda
    après m'être renseigné un peu j'ai vu qu'il existait une certaine méthode pour éviter ce genre de problème mais je ne l'ai pas compris.

    Quelqu'un pourrait il me l'expliquer ?
    euh vi je vais essayer... c'est quoi la méthode que tu n'as pas compris?

    si c'est le multi-threading, tu peux essayer de la manière suivante:

    Dans une classe quelconque:
    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
     
    class MaClasse implements Runnable{
     
      public void run(){
     
        // ici tu fais ta boucle. N'oublie pas à chaque itération de faire un appel à Thread.sleep(), sinon les effets du multithreading ne se feront pas sentir
     
      }
     
     
      public static void main(String[] args){
     
        new Thread(this).start();
     
        ...
     
      }
     
    }
    si j'ai répondu à côté pardon, mais bon j'ai deja pas très bien compris la question alors voilà....



  4. #4
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    m***e me suis fait griller ! lol

  5. #5
    Membre à l'essai
    Inscrit en
    Octobre 2004
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 29
    Points : 23
    Points
    23
    Par défaut
    Au moins Pill_S tu as proposé la variant Runnable ... il aura le choix ainsi

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 95
    Points : 47
    Points
    47
    Par défaut
    oui c est du multi threading
    voici 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
     
    //c'est l'évenement d'un bouton
    public class lancer_serv implements ActionListener
    	{
    		public void actionPerformed(ActionEvent evt)
    		{
    				try
    				{
    					server = new serveur();
    					server.serveur_connect();
    				}
    				catch(IOException except)
    				{
    				}
    		}
    	}
    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.net.*;
    import java.io.*;
    import java.lang.String.*;
    public class serveur
    {
    	public serveur() throws IOException
    	{
    	}
    	public void serveur_connect() throws IOException
    	{
    		int numero=1;
    		//System.out.println("Serveur Connecté");
    		try 
    		{
    			ServerSocket ecoute =new ServerSocket(1234);
    			while(true)
    			{
    				Socket connexion = ecoute.accept();
    				new threadserveur(connexion, numero++).start();
    			}
    		}
    		catch (IOException ioe)
    		{
    			//System.out.println(" erreur " +ioe);
    		}
    	}
    	public void serveur_arret()
    	{
    	}
    }
    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
     
    import java.lang.String.*;
     
    public class threadserveur extends Thread
    {
    	Socket connexion;
    	int numero;
    	public threadserveur(Socket connexion, int numero)
    	{
    		this.connexion = connexion;
    		this.numero = numero;
    	}
    	public void run()
    	{
    		try
    		{
    			BufferedReader entrer = new BufferedReader(new InputStreamReader(connexion.getInputStream()));
    			PrintWriter sortir = new PrintWriter(connexion.getOutputStream(), true);
    			sortir.println("Vous etes bien sur le serveur meda.homelinux.com\nPour sortir du serveur taper quit");
    			boolean arreter = false;
    			while (!arreter)
    			{
    				String ligne = entrer.readLine();
    				if(ligne==null)
    				{
    					arreter=true;
    				}
    				else
    				{
    					//System.out.println(ligne);
    				}
    			}
    			//System.out.println("Connexion client terminé");
    			connexion.close();
    		}
    		catch(IOException e)
    		{
    		System.out.println(e);
    		}
    	}
    }
    Le code n'est peut être pas super mais je suis débutant en java donc j'ai un peu du mal.
    pour ce qui est de sleep je ne sais pas comment sa marche et où le mettre.

  7. #7
    Membre éprouvé
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Points : 1 085
    Points
    1 085
    Par défaut
    C'est normal, dans la classe serveur tu ne dois pas faire ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ServerSocket ecoute =new ServerSocket(1234); 
    while(true) 
    { 
       Socket connexion = ecoute.accept(); 
       new threadserveur(connexion, numero++).start(); 
    }
    parceque forcémment ça bloque étant donné que ce n'est pas dans un Thread...

    A mon avis la classe serveur doit aussi être lancée dans un Thread...


  8. #8
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    // à executer a chaque passage dans la boucle while(true) de ta méthode run
    try{
      Thread.sleep(20);
    } catch(InterruptedException e){
     
    }
    ensuite tu crée ton thread et tu le lance
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Thread t1 = new MonThread();
    t1.setDaemon(true);
    t1.start();

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 95
    Points : 47
    Points
    47
    Par défaut
    C est bon ça marche j'ai mis serveur en thread et threadserveur avec .setDaemon(true);
    J'ai deux petites questions :
    - pourquoi ça marche avec ces changements et que mon ancienne version ne marche pas.
    - comment pouvoir stopper le thread car j'ai lu que la méthode stop n'était pas super.

    merci pour votre aide.

  10. #10
    Membre éprouvé
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Points : 1 085
    Points
    1 085
    Par défaut
    Ca bloque tout parceque quand tu cliques sut on bouton tu lances la classe 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
    15
    16
    17
    18
    19
    20
    21
    public class serveur {
       ....
       public void serveur_connect() throws IOException { 
          int numero=1; 
          //System.out.println("Serveur Connecté"); 
          try { 
             ServerSocket ecoute =new ServerSocket(1234); 
     
             // VOILA LA BOUCLE INFINIE !!!
             while(true) { 
                Socket connexion = ecoute.accept(); 
                new threadserveur(connexion, numero++).start(); 
             }
             // ----------------------------------
          } 
          catch (IOException ioe) { 
             //System.out.println(" erreur " +ioe); 
          } 
       } 
       ...
    }
    qui fait un while (true) ... donc un boucle infinie donc ça ne rend pas la main à la méthode appelante car c'est dans le même thread que la méthode appelante !!!

    Sinon pour arrêter un thread proprement sans la méthode stop cf

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 95
    Points : 47
    Points
    47
    Par défaut
    ok merci beaucoup pour votre aide.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 04/01/2008, 12h44
  2. Thread / Modification Interface de la Form
    Par Jimmy_S dans le forum C#
    Réponses: 4
    Dernier message: 05/06/2007, 09h26
  3. Thread : class Thread VS. interface Runnable
    Par shawty dans le forum Concurrence et multi-thread
    Réponses: 6
    Dernier message: 11/03/2007, 22h09
  4. [Thread] Interface et thread
    Par airod dans le forum Général Python
    Réponses: 16
    Dernier message: 03/01/2007, 13h38
  5. Réponses: 6
    Dernier message: 04/08/2006, 12h24

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