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

Langage Java Discussion :

MultiThread comment faire ?


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juin 2005
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 139
    Par défaut MultiThread comment faire ?
    Bonjour à toute et à tous,
    premièrement ne vous focaliser pas sur l'exemple car je l'ai calqué un peu par rapport aux objets que je manipule sur le projet de ma société.
    ce que je voudrai faire c'est d’exécuter plusieurs Thread Java afin d'aller plus vite au niveau du traitement. bien évidement mon projet de société est plus gros et du coup il prend beaucoup de temps.
    La methode que je veux multithreadé est fetchMap()
    Je voudrai lancer 10 Threads en parallèle sur cette méthode.

    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
     
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;
    import java.util.Set;
     
    public class MultiThread  {
     
     
    	Map<Personne, List<Animal>> mapP = new HashMap<>();
    	List<Animal> list = new ArrayList<>();
     
    	public MultiThread(){
    		init();
    		fetchMap();
    	}
     
    	public void init(){
    		Personne p0= new Personne("Dupont","Eric",00);
    		Personne p1= new Personne("Durant","Etienne",10);
    		Personne p2= new Personne("Newton","Isaac",20);
    		Personne p3= new Personne("Sartre","Paul",30);
     
    		Animal a0= new Animal("Chien");
    		Animal a1= new Animal("Chat");
    		Animal a2= new Animal("Lion");
    		Animal a3= new Animal("Tigre");
     
    		list.add(a0);
    		list.add(a1);
    		list.add(a2);
    		list.add(a3);
     
    		mapP.put(p0, list);
    		mapP.put(p1, list);
    		mapP.put(p2, list);
    		mapP.put(p3, list);
    	}
     
    	public void fetchMap(){
    		Set<Personne> listKeys=mapP.keySet(); 
    		Iterator<Personne> iterateur=listKeys.iterator();
     
    		while(iterateur.hasNext())
    		{
    			Personne personne= iterateur.next();
    			StringBuffer str = new StringBuffer();
     
    			for (Animal animal : mapP.get(personne)) {
     
    					str.append(animal.getType() + " ");
    			}
    			System.out.println ("M. " + personne.getNom() + " Possede les animaux suivant : " + str);
    		}
    	}
     
    	public static void main(String[] args) {
     
    		MultiThread main =new MultiThread(); 
    	}
     
     
    }
    Le code de la classe Personne et Animal est facilement deductible. juste qq attributs et rien de particuliers.
    Je vous serai reconnaissant.

    Cordialement

  2. #2
    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
    Juste quelques remarques:

    Ton code ne fait rien d'utile donc difficile de savoir ce que tu veux paralléliser ou de savoir si l'ordre de traitement est important.
    On ne parcoure jamais une map par KeySet pour ensuite faire un get(), on parcours directement par entrySet, c'est bien plus performant. Un get sur une map prend LOG(N), tu as donc un algo en NLog(N) alors qu'un parcours par entrySet fait du N.
    Qu'est-ce qui est lent dans ton problème?
    Qu'est-ce qui te coince dans ta parallélisation?
    Qu'est-ce qui te fait croire que la parallélisation est une solution à ton problème?


    Si tu veux parcourir une liste d'animaux pour faire quelque chose sur chaque animal, oui tu peux paralléliser ça. Via un parallelStream par exemple, avec java 8.
    Pareil pour le parcours d'une map.

  3. #3
    Membre Expert
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Par défaut
    Accessoirement, tes 10 threads parcoureraient les mêmes collections/maps d'éléments, et afficheraient tous la même chose, à moins de synchroniser les accès en lecture aux éléments de ta map ce qui ne ferait que ralentir encore plus l'application (au point qu'elle soit plus lente qu'une appli sans threads)

  4. #4
    Membre confirmé
    Inscrit en
    Juin 2005
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 139
    Par défaut
    Merci Tchiz et eulbobo pr vos remarques.
    Comme j'ai évoqué mon code est adapté ici par rapport au code de la société pr ne pas qu'on le reconnaisse sur le site.
    Le but est de remplir une liste d'objet ( là j'ai juste mis les afichages) mais en vérité ça remplit une liste ou par exemple on mettrai toutes les personnes et la liste des animaux (c'est encore une fois un exemple).
    donc je voulais savoir si je lance 10 Threads sur la même méthode ( fetchMap), il y'a un risque que ca m'affiche 10fois par chaque thread alors que moi je veux un traitement pour chaque élément de la liste.
    Pour illustrer : le premier thread par exemple traite le premier element de la liste, le 2eme thread traite le 2eme élément de la liste(et en aucun cas le 2eme thread traite le premier élément car il est déjà traité par le 1eme thread.)
    si j'insiste c'est que j'ai un batch java qui prend environ 3h pour traiter toutes les informations.
    Merci tchize_ pour la subtilité sur le parcours des maps.



    cordialement
    Images attachées Images attachées  

  5. #5
    Membre Expert
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Par défaut
    Du coup, comme je le disais, il va falloir faire en sorte de synchroniser tout ça

    Synchroniser l'accès en lecture à l'élément next de ton itérateur sur l'entrySet (deux threads ne doivent pas travailler sur le même élément)
    Synchroniser l'accès en écriture sur ta liste finale (là ça va être très coûteux)


    Autre possibilité : chaque Thread possède sa propre liste de résultats à ajouter, et à la fin du traitement, tu fais un merge de tous les résultats de chaque Thread. (avec les interfaces Callable et Future)


    Il te faudrait donc
    Une méthode synchronisée d'une manière ou d'une autre qui permette à tes threads d'accéder les uns après les autres à ton itérateur de map (je conseille l'utilisation d'un ReentrantReadWriteLock en utilisant en lock de type readerLock).
    Un pool de thread (Executors.newFixedThreadPool(10) )
    Une classe qui implémente Callable à laquelle tu passes la valeur de ton EntrySet et qui te renvoie ce dont du as besoin (que tu peux ajouter à ta liste)

    Par contre, attention ! La programmation multithread est quelque chose de délicat auquel il faut faire très attention : on peut avoir l'impression de gagner du temps mais au final on peut se retrouver dans des situations dans lesquelles on ralenti les choses plus qu'autre chose à cause d'un syndrome de bottleneck

    D'ailleurs, pourquoi 10 threads? (la réponse est importante)

  6. #6
    Membre confirmé
    Inscrit en
    Juin 2005
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 139
    Par défaut
    Encore merci eulbobo

    Pourquoi 10 Threads? je sais pas. je me suis dis que 10 devraient suffir.
    tu as mieux comme idée?
    apres tous ce que tu m'as dis je maitrise rien.
    Je n'ai pas le niveau expert comme toi :-(
    si tu as un exemple simple je veux bien.
    Merci infiniment.

Discussions similaires

  1. [VB6][impression]Comment faire des effets sur les polices ?
    Par le.dod dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 08/11/2002, 10h31
  2. comment faire evoluer ma base vers interbase6
    Par toure32 dans le forum InterBase
    Réponses: 5
    Dernier message: 23/10/2002, 10h59
  3. Réponses: 8
    Dernier message: 18/09/2002, 03h20
  4. Comment faire pour mettre l'ecran en veille ?
    Par March' dans le forum MFC
    Réponses: 6
    Dernier message: 29/08/2002, 14h25
  5. Comment faire pour créer un bitmap
    Par GliGli dans le forum C++Builder
    Réponses: 2
    Dernier message: 24/04/2002, 15h41

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