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

Java Discussion :

Utilisation des threads


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    developpeur
    Inscrit en
    Avril 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : developpeur

    Informations forums :
    Inscription : Avril 2012
    Messages : 30
    Par défaut Utilisation des threads
    Bonjour,

    Développant une application d'envoi de paramètres par connexion Telnet.

    Avant l'envoi de données je vérifie que l'équipement est bien connecté.
    Comme le nombre d'IP à vérifier n'est jamais le même, j'utilisate les threads afin de les faires en paralleles.

    j'utilise le code suivant :

    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
    import java.net.InetAddress;
    import java.net.*;
    import java.util.ArrayList;
     
    class threadping 
    {
    	threadping()
    	{
    		ArrayList<testip> maliste = new ArrayList<testip>();
    		maliste.add(new testip ("192.168.1.100")); //ok
    		maliste.add(new testip ("192.168.1.200")); //erreur
    		maliste.add(new testip ("192.168.1.240")); //ok
    		maliste.add(new testip ("192.168.1.8"));    //erreur
     
    		for (testip tp : maliste)
    		{
    			tp.start() ;
    		}
     
    		try
    		{
    			for( testip tp : maliste)
    			{
    				tp.join() ;
    			}
    		}
    		catch(Exception e)
    		{
    			e.printStackTrace();
    		}
    	}
    }
    class testip extends Thread
    {
    	private boolean pingOK = false ;
    	int tpsTimeOut = 2000;
     
    	public testip(String nom)
    	{
    		try
    		{		
    			InetAddress i = InetAddress.getByName(nom);
    			pingOK = i.isReachable(tpsTimeOut);
    			if(pingOK)
    			{
    				System.out.println(" => OK");
    			}
    			else
    			{
    				System.out.println(" => ECHEC !!!");
    			}
    		}
    		catch(Exception e)
    		{
    			e.printStackTrace();
    		}
    	}
    }
     
     
    public class essai
    {
    	public static void main (String[] args)
    	{
    		threadping moi = new threadping();
    	}
    }
    Mon soucis c'est que le test sur ces 4 ip dure 6s. Je ne comprends pas pourquoi le test est si long, cela est surement du à une mauvaise utilisation des threads.

    De plus puis je ajouter dynamiquements des éléments dans l'arraylist.


    Merci de votre aide

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Ton thread testip est mal codé. Tu fait tout le travail dans le constructeur. C'est donc lors de l'ajout dans l'ArrayList que le travail est fait. Ta boucle faisant les start() devient inutile.
    Ton programme n'est pas multi-threadé mais séquentiel.

    Dans ta classe Thread, tu dois surcharger la méthode public void run() et y placer le code de connexion, celui actuellement présent dans le constructeur.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Membre averti
    Homme Profil pro
    developpeur
    Inscrit en
    Avril 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : developpeur

    Informations forums :
    Inscription : Avril 2012
    Messages : 30
    Par défaut
    Bonsoir,

    Pour que le code s'execute dans mon constructeur, je dois appeler la fonction start dans le constructeur, un peu comme ci-dessous.
    Même si là cela ne fonctionne pas, et je ne vois pas trop comment faire.
    entre la boucle de mon ArrayListe et mon start()

    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
     
    import java.net.InetAddress;
    import java.net.*;
    import java.util.ArrayList;
     
    class threadping 
    {
    	threadping()
    	{
    		ArrayList<testip> maliste = new ArrayList<testip>();
    		maliste.add(new testip ("192.168.1.100"));
    		maliste.add(new testip ("192.168.1.200"));
    		maliste.add(new testip ("192.168.1.240"));
    		maliste.add(new testip ("192.168.1.8"));
     
    		try
    		{
    			for( testip tp : maliste)
    			{
    				tp.join() ;
    			}
    		}
    		catch(Exception e)
    		{
    			e.printStackTrace();
    		}
    	}
    }
    class testip extends Thread
    {
    	boolean pingOK = false ;
    	int tpsTimeOut = 2000;
    	String nom;
     
    	public testip(String nomip)
    	{
    		this.nom = nomip;
    	}
     
    	public void run()
    	{
    		try
    		{		
    			InetAddress i = InetAddress.getByName(nom);
    			pingOK = i.isReachable(tpsTimeOut);
    			if(pingOK)
    			{
    				System.out.println(" => OK");
    			}
    			else
    			{
    				System.out.println(" => ECHEC !!!");
    			}
    		}
    		catch(Exception e)
    		{
    			e.printStackTrace();
    		}
    	}
     
    }
     
     
    public class essai
    {
    	public static void main (String[] args)
    	{
    		threadping perso = new threadping();
    		testip moi = new testip();
     
    		for (perso tp : maliste)
    		{
    			tp.start() ;
    		}
    	}
    }

    Merci de votre aide.

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par andarius40 Voir le message
    Pour que le code s'execute dans mon constructeur,
    Ne fais pas ça, c'est tout. Il ne faut pas que le code s'exécute dans le constructeur.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre averti
    Homme Profil pro
    developpeur
    Inscrit en
    Avril 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : developpeur

    Informations forums :
    Inscription : Avril 2012
    Messages : 30
    Par défaut
    Bonjour,

    après plusieurs tests, voici ce que j'ai fait :

    Je créer un tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public String TabSallesVsx[][] = {{"",""},{"",""},{"",""},{"",""},{"",""}};
    Depuis un JPanel selon ce qui est coché, je rempli la colonne 0 de chaque ligne avec l'adresse IP à tester puis lors de l'action sur un bouton je récupère les IP dans un ArrayList.

    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
     
    class ComTelnetListener implements ActionListener
    {
     
    	public void actionPerformed(ActionEvent e)
    	{
     
    	ArrayList<testip> maliste = new ArrayList<testip>();
    	for (int i = 1 ; i <= ((TabSallesVsx.length) - 1) ; i++ )
    		if (TabSallesVsx[i][0].isEmpty() == false)
    		{
    			maliste.add(new testip (TabSallesVsx[i][0]));
    		}
     
    		for (testip tp : maliste)
    		{
    			tp.start() ;
    		}
     
    		try
    		{
    			for( testip tp : maliste)
    			{
    				tp.join() ;
    			}
    		}
     
    		catch(Exception ei)
    		{
    			ei.printStackTrace();
    		}
    	}
    }
    Puis l'appel de la classe testip me permet de faire les ping en thread.

    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
     
    class testip extends Thread
    {
    	boolean pingOK = false ;
    	int tpsTimeOut = 2000;
    	String nom;
     
    	public testip(String nomip)
    	{
    		this.nom = nomip;
    	}
     
    	public void run()
    	{
    		try
    		{		
    		InetAddress i = InetAddress.getByName(nom);
    		pingOK = i.isReachable(tpsTimeOut);
     
    			if(pingOK)
    			{
    				System.out.println(this.nom  +"=> OK");		
    			}
    			else
    			{
    				System.out.println(this.nom +"=> ECHEC !!!");
    			}
    		}
     
    		catch(Exception e)
    		{
    			e.printStackTrace();
    		}
    	}
    }
    Mon code me renvoi des OK alors que le pc n'est pas connecté au réseau et qu'en local je suis en dhcp.

    J'aimerai comprendre mon erreur.

    De plus comment faire pour rechercher l'adresse IP tester dans mon tableau TabSallesVsx afin de reneigner la colonne 1, pour le résultat du ping.

    P.S. : Si il le faut je peux fournir tout le code.

    Merci de votre aide.

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par andarius40 Voir le message
    Mon code me renvoi des OK alors que le pc n'est pas connecté au réseau et qu'en local je suis en dhcp.
    Qu'est-ce que tu entends pas "en local en dhcp" et "pas connecté au réseau". un serveur dhcp implique une connexion réseau :s


    Si isReachable renvoie true, c'est que la machine est joignable.

    Pour ce qui est de récupérer les résultat, fait le après le join dans ta liste. Il suffit que testip stocke le résultat dans un de ses champs, après le join tu lit tous les résultat et t'en fait ce que tu veux.

    aussi, en java
    un nom de class, ca commence pas une majuscule
    un nom de variable, de champ ou de méthode, ça commence pas une minuscule.

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

Discussions similaires

  1. Avis sur la bonne utilisation des Threads
    Par Pitivier dans le forum Général Java
    Réponses: 8
    Dernier message: 28/11/2006, 20h07
  2. connexion socket utilisant des threads
    Par alceste dans le forum C++
    Réponses: 16
    Dernier message: 14/10/2006, 12h00
  3. [Débutant]Utilisation des Threads
    Par maniolo dans le forum Débuter avec Java
    Réponses: 19
    Dernier message: 10/07/2006, 11h31
  4. Utilisation des threads
    Par Valinor dans le forum Linux
    Réponses: 2
    Dernier message: 30/11/2005, 16h41
  5. Utilisations des Threads
    Par phoenix440 dans le forum Réseau
    Réponses: 15
    Dernier message: 21/08/2005, 17h19

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