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 :

Problèmes de multi-threading


Sujet :

Java

  1. #1
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Par défaut Problèmes de multi-threading
    Bonjour,

    je fais une recherche exhaustive (calcul de toutes les combinaisons possibles). Mais pour accélérer le processus, je lance plusieurs threads (autant que de CPU) et je dois donc synchroniser le travail de mes différents threads.

    voici ma recherche exhaustive (classique) :
    Code java : 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
     
    private List<Integer> threadsfree = new Vector<Integer>() ;
     
    private void Compute(int column)
    	{
    	if ( "bas/feuille de l'arbre de recherche, donc on travaille" )
    		{
    		int free = getFreeThread() ; // On attend un thread libre (appel bloquant).
     
    		synchronized ( threads[free].lock ) // On synchronise le verrou.
    			{
    			threads[free].Work(mywork) ; // On donne le travail
    			threads[free].lock.notify() ; // On lance le thread.
    			}
     
    		return ;
    		}
    	...
    	}


    Pour faire cela, j'ai donc une méthode qui s'occupe d'attendre qu'un thread soit libre :
    Code java : 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
     
    private synchronized int getFreeThread()
    	{
    	while ( threadsfree.isEmpty() ) // On attend qu'un thread soit libre.
    		try	{
    			wait() ;
    			}
    		catch ( InterruptedException e )
    			{
    			e.printStackTrace() ;
    			}
     
    	int free ;
    	synchronized ( threadsfree )
    		{
    		free = threadsfree.get(0) ; // On récupère le numéro du thread libre
    		threadsfree.remove(0) ; // On supprime le thread de la liste.
    		}
    	// J'ai testé, ici le thread "free" n'est plus dans la liste et il n'y a pas de doublon.
    	return free ;
    	}


    Et voici le thread qui fait le travail demandé :
    Code java : 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
     
    private class SysResThread extends Thread
    {
     
    private int number = -1 ;
     
    public Object lock = new Object() ;
     
     
     
    public SysResThread(SystematicResearch parent, int number)
    	{
    	super() ;
    	this.parent = parent ;
    	this.number = number ; // Numéro unique (bien évidemment).
    	}
     
     
    public void run()
    	{
    	while ( true ) // On boucle pour garder le thread actif.
    		{
    		synchronized ( lock )
    			{
    			try {
    				parent.addFreeThread(number) ; // On a finit (ou pas commencé), donc on signale que l'on est libre.
     
    				lock.wait() ; // On attend du boulot. Seul le parent libère le thread.
    				// On arrive ici que si le thread a été libre et a été libéré par la classe mère/parent.
    				// Souci... le thread est toujours dans la liste des threads libres :-(
    				}
    			catch ( InterruptedException e )
    				{
    				e.printStackTrace() ;
    				}
    			}
     
    		// ... on fait la travail ici.
    		}
    	}
     
    }

    Mais tout ceci ne fonctionne pas :-(
    Dans la classe/thread, je m'aperçois qu'après que le thread ait été libéré par la classe parent, il apparaît toujours dans la liste des threads libres :-(

    Il me semble avoir tout synchronisé comme il se doit, attendre les threads, etc.
    Mais pourquoi diable est ce que parfois un thread apparaît toujours dans la liste des threads libres ?

    Est ce que quelqu'un aurait une idée ?
    Merci par avance...
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  2. #2
    Membre émérite Avatar de Gardyen
    Homme Profil pro
    Bio informaticien
    Inscrit en
    Août 2005
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : Août 2005
    Messages : 637
    Par défaut
    tu ne veux pas utiliser l'api java.util.concurrent, le Semaphore plus exactement ?

  3. #3
    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
    En fait, ce genre de constructions est typiquement le boulot de ThreadPoolExecutor.

    Quant à savoir pourquoi ça marche pas comme ça, pfff, il y a trop de synchronized sur trop de trucs différents.
    Il y a une ressource partagée, une seule : un ensemble de threads libres pour travailler. Il faut synchroniser ça et rien d'autre.
    (Éventuellement il peut y avoir besoin de synchroniser un "gestionnaire des résultats.")
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Par défaut
    Citation Envoyé par Gardyen Voir le message
    tu ne veux pas utiliser l'api java.util.concurrent, le Semaphore plus exactement ?
    J'ai essayé mais sans meilleurs résultats :-(
    De plus sur tous les cours disponibles dans le forum, il est dit que ce que je fais est équivalent.
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  5. #5
    Membre émérite Avatar de Gardyen
    Homme Profil pro
    Bio informaticien
    Inscrit en
    Août 2005
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : Août 2005
    Messages : 637
    Par défaut
    comme indiqué par thelvin, le ThreadPoolExecutor correspond à ce que tu veux réaliser, en particulier le Executors.newFixedThreadPool(int).

  6. #6
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Par défaut
    Au détail près que j'ai l'impression que le ThreadPoolExecutor lance un nouveau thread par nouvelle tâche.
    Dans mon cas, je ne tue jamais un thread, je souhaite le débloquer pour qu'il réalise une tâche, puis qu'il se bloque jusqu'à ce qu'on lui affecte une nouvelle tâche.
    Ce qui explique la bouche While bloquante dans le méthode Run() de mon thread.
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  7. #7
    Membre émérite Avatar de Gardyen
    Homme Profil pro
    Bio informaticien
    Inscrit en
    Août 2005
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : Août 2005
    Messages : 637
    Par défaut
    d'où le fixedThreadPool, cf la doc:
    Creates a thread pool that reuses a fixed number of threads operating off a shared unbounded queue.

  8. #8
    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 ToTo13 Voir le message
    Au détail près que j'ai l'impression que le ThreadPoolExecutor lance un nouveau thread par nouvelle tâche.
    Euh, un ThreadPoolExecutor s'arrange donc pour ne pas utiliser de pool. Logique.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Par défaut
    Citation Envoyé par Gardyen Voir le message
    d'où le fixedThreadPool, cf la doc:
    Ok je vais regarder.
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  10. #10
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Par défaut
    Je ne sais pour quelle raison obscure, mon code marche parfaitement : plus aucune erreur !
    Je n'arrivais pas à comprendre l'erreur et du coup j'ai remis exactement le code d'origine (récupération dans un backup). Après un redémarrage, tout fonctionne à nouveau :s.

    Je vais toutefois essayer de faire fonctionner cela avec les classes dédiées.
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  11. #11
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Par défaut
    J'ai finalement utilisé une BlockingQueue pour remplacer la liste que j'avais et cela fait très bien le travail. Cela pourra peut être intéressé quelqu'un.

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    BlockingQueue<SysResThread> threadsfree = new ArrayBlockingQueue<SysResThread>(nbCPU) ;
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

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

Discussions similaires

  1. Ubuntu 11.10 sur Vmware : problème de multi-threading?
    Par khealou dans le forum Threads & Processus
    Réponses: 1
    Dernier message: 30/12/2012, 11h33
  2. Réponses: 7
    Dernier message: 12/06/2011, 07h14
  3. Probléme serveur multi-thread
    Par hebus44 dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 14/11/2007, 22h32
  4. Problème Seveur multi-thread
    Par Doom2Darkness dans le forum C++
    Réponses: 14
    Dernier message: 05/06/2007, 19h32
  5. problme de multi thread
    Par L4BiN dans le forum Concurrence et multi-thread
    Réponses: 22
    Dernier message: 25/04/2007, 16h47

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