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 :

[Thread] 1 liste de string, 4 threads, ordre de traitement


Sujet :

Concurrence et multi-thread Java

  1. #1
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2007
    Messages : 500
    Points : 238
    Points
    238
    Par défaut [Thread] 1 liste de string, 4 threads, ordre de traitement
    Bonjour,
    je vous explique la situation :

    J'ai une application dans laquelle j'ai un fichier .txt en entrée contenant une liste de tables (bdd) , mes threads sont sensés traiter ces lignes une à une, en respectant l'ordre du fichier.

    Ce que j'aurais voulu faire, c'est avoir un ArrayList<String> dans ma classe principale (qui appelle les threads) qui contiendrait les noms de tables, et que mes threads bouclent sur cette liste et dès qu'ils ont traité un élément, le supprime de mon ArrayList.

    Problème => exception de concurrence, forcement, mais dès le moment ou je fais une boucle for dans le run du thread.


    J'ai essayé d'englober ma boucle par un bloc synchronized, sans résultats.


    Avez-vous une piste?
    L'intelligence c'est comme la confiture, moins tu en as , plus tu l'étales...

  2. #2
    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 erox44 Voir le message
    mes threads sont sensés traiter ces lignes une à une, en respectant l'ordre du fichier.
    Tu pourrais préciser ce point ?
    En quoi l'ordre est important ?

    Parce que si le traitement d'une ligne requiert que la précédente soit fini, alors tes threads ne te serviront à rien...




    Sinon depuis Java 5 tu peux utiliser les BlockingQueue, qui gère tout le coté concurrentielle.
    Exemple vite fait :
    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
    	// On crée une blocking queue avec 10 éléments
    	// Remarque : si on ne connait pas le nombre d'élément
    	// il peut être préférable d'utiliser un LinkedBlockingQueue
    	final BlockingQueue<String> queue = new ArrayBlockingQueue<>(10);
    	for (int i=0; i<10; i++) {
    		queue.add("Ligne " + i);
    	}
     
    	// On crée un ExecutorService qui va executer les tâches :
    	ExecutorService service = Executors.newFixedThreadPool(4);
     
    	// On démarre les 4 threads :
    	for (int i=0; i<4; i++) {
    		service.submit(new Runnable() {
    			@Override
    			public void run() {
    				String value;
    				// On traite les données tant qu'il y en a :
    				while ( (value=queue.poll()) != null ) {
    					System.out.printf("%s : %s%n",
    						Thread.currentThread().getName(),
    						value);
    					// sleep() pour simuler un traitement "long" :
    					try {
    						Thread.sleep(500);
    					} catch (InterruptedException e) {
    						// ignore
    					}
    				}
    			}
    		});
    	}
     
    	// On arrête l'ExecutorService
    	// (il n'acceptera plus de nouvelle tâche)
    	service.shutdown();
    	// Et on attend la fin de toutes les tâches actives
    	service.awaitTermination(1, TimeUnit.MINUTES);
    	System.out.println("queue = " + queue);

    a++

  3. #3
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2007
    Messages : 500
    Points : 238
    Points
    238
    Par défaut
    En fait:

    Mon fichier texte contient une ligne de table, dont certaines sont liées via des clés étrangères, il est donc nécéssaire d'insérer d'abord la table parent puis enfant.

    Mes threads sont là pour les grosses tables, dans lesquelles je vais devoir insérer plus de 20000 lignes, chaque thread gère 20000 lignes.
    L'intelligence c'est comme la confiture, moins tu en as , plus tu l'étales...

  4. #4
    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
    Ben si tu dois impérativement respecter l'ordre, les threads ne servent à rien...


    a++

  5. #5
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2007
    Messages : 500
    Points : 238
    Points
    238
    Par défaut
    Hm, pour le coup je suis parti sur une :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LinkedBlockingQueue<String>
    Ca fonctionne pas mal là.

    En fait, pour un schéma comme suit :

    - table parente X => 9.000 lignes
    - table enfant Y => 100.000 lignes => découpé en sous-fichiers de 20.000

    on doit insérer en 1er le .sql de X, puis ceux de Y, mais ceux de Y , peut importe l'ordre, c'est là que les threads sont utilisés.
    L'intelligence c'est comme la confiture, moins tu en as , plus tu l'étales...

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

Discussions similaires

  1. Référence à une liste en paramètre à un thread
    Par Bktero dans le forum Général Python
    Réponses: 9
    Dernier message: 17/04/2012, 18h10
  2. vector <string> paramètre thread
    Par parabole33 dans le forum Threads & Processus
    Réponses: 7
    Dernier message: 05/01/2012, 19h41
  3. Réponses: 1
    Dernier message: 04/12/2008, 13h51
  4. Comparaison d'une liste de string à un string
    Par maxazac dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 19/10/2005, 15h39
  5. Fichier ecrit par un Thread et lu par un autre Thread
    Par Fladnag dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 27/04/2004, 14h56

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