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 callable pas executer en parallele


Sujet :

Concurrence et multi-thread Java

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Février 2011
    Messages : 192
    Points : 107
    Points
    107
    Par défaut threads callable pas executer en parallele
    bonjour,

    je viens de decouvrir l'interface Callable, et j'aimerais l'utiliser plutot que Runnable.

    J'ai deja trouvé des explications sur le fonctionnement et tout ca, mais mon code n'est pas executé en parallele, mais en sequentiel.. pourtant je ne vois pas ce que j'aurais mal fait.

    pouvez vous m'aider ? merci d'avance

    voici mon code :


    le 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
    36
     
    public class ThreadPing implements Callable<Boolean> {
     
    	private InetAddress ipBus;
     
    	public Boolean call() throws Exception {
    		boolean retIP = lancementPing();
    		return retIP;
    	}
     
            private boolean lancementPing() {
     
        	   try {
        		boolean accessible = ipBus.isReachable(1000);
     
    		if (accessible){
    			return true;
    		}else{
    			return false;
    		}
     
    	   } catch (IOException e) {
    		e.printStackTrace();
    	   }
    	return false;
            }
     
    	public ThreadPing(int numTBA){
     
    		try {
    			this.ipBus = InetAddress.getByName(Config.getProperty("global.adresseBus") + numTBA);
    		} catch (UnknownHostException e) {
    			e.printStackTrace();
    		}
    	}
    }

    appel du 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
     
     
    ExecutorService executor = Executors.newCachedThreadPool();
     
    for (int i=0 ; i<nbBus ; i++){
    	numTBA = listeBus.get(i).getTba();
    	numBus = listeBus.get(i).getNumero();
     
    	Future<Boolean> f1 = executor.submit(new ThreadPing(numTBA));
     
    	try {
    		if (f1.get() == true){
    			System.out.println("adresse 10.22.6." + numTBA + " accessible");
    		}
    	} catch (InterruptedException e) {
    		e.printStackTrace();
    	} catch (ExecutionException e) {
    		e.printStackTrace();
    	}
    j'utilise bien les objets Executor et Future donc je ne vois vraiment pas..

  2. #2
    Expert éminent sénior
    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 : 45
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    La méthode get() sur un Fututre attends que le calcul soit terminé, donc en gros vous faites ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    pour i de 1 à N
      lancer un calcul en parallèle
      attendre la fin du calcul et lire son résultat
    fin pour
    Vous devez créer et mettre en queue tous vos Future en boucle et puis, après seulement, dans une autre boucle, regarder les résultats
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    pour i de 1 à N
      lancer un calcul en parallèle
    fin pour
    pour i de 1 à N
      attendre la fin du calcul i et llire son resultat
    fin pour

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Février 2011
    Messages : 192
    Points : 107
    Points
    107
    Par défaut
    ok je comprend.
    merci bien ! ca marche effectivement. mais je trouve ca lourd de faire deux boucles qui se suivent.

    sinon par rapport a ton algo, pour ma boucle, N représente le nombre de thread, donc pour pouvoir faire les get() il faut que, lors de la premiere boucle, que je conserve les objets Future ?

    je ne pense pas que mon code soit vraiment optimisé... qu'en penses tu ?

    merci bcp en tout cas !

    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
     
     
    ExecutorService executor = Executors.newCachedThreadPool();
    List<Future> listeFuture = new Arraylist<Future>();
     
    for (int i=0 ; i<nbBus ; i++){
     
    	numTBA = listeBus.get(i).getTba();
    	listeFuture.add(executor.submit(new ThreadPing(numTBA)));
    }
     
    int size = listeFuture.size();
     
    for (int i=0 ; i<size ; i++){
     
    	try {
    		Future f = (Future)listeFuture.get(i);
    		boolean res = (Boolean)f.get();
     
    	} catch (InterruptedException e) {
    		e.printStackTrace();
    	} catch (ExecutionException e) {
    		e.printStackTrace();
    	}
    }

  4. #4
    Expert éminent sénior
    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 : 45
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    ca me semble correct.
    Pour éviter de maintenir la liste de Future, vous pouvez aussi avoir chaque Callable qui met à jour les informations dans une hashmap au lieu de retourner un valeur. Ensuite, après boucle, faire un shutdown du service et attendre que tout aie été exécuté, puis afficher le résultat. Ca évite la deuxième boucle, mais ca augmente le travail du callable.

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Février 2011
    Messages : 192
    Points : 107
    Points
    107
    Par défaut
    merci beaucoup !

    J'ai gardé la première solution mais j'ai nettoyé pour enlever quelques traitements.

    je peux passer en résolu !

    Bonne journée

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

Discussions similaires

  1. Boost::Thread, probleme d'execution en parallele
    Par Jdumont dans le forum Boost
    Réponses: 4
    Dernier message: 05/03/2012, 14h47
  2. thread / doevents / timer -> ca veut pas faire en parallele
    Par ubuntu_flo dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 04/08/2011, 08h20
  3. Réponses: 3
    Dernier message: 05/06/2005, 01h52
  4. [Debutant(e)]je n'arrive pas à executer eclipse
    Par popogendarme dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 04/12/2004, 20h28
  5. [THREAD][DAEMON]Pas bien compris....
    Par XristofGreek dans le forum Concurrence et multi-thread
    Réponses: 2
    Dernier message: 24/09/2004, 13h28

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