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 :

Réutilisation d'un thread


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 : 45
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut Réutilisation d'un thread
    Bonjour tout le monde,

    je m'amuse depuis quelques temps à manipuler des threads et j'aurai souhaité savoir si je m'y prends bien.

    J'ai un calcul de base à faire de TRES nombreuses fois pour lequel seules les conditions de départ changent. Donc je souhaite lancer un calcul par CPU, mais ne pas avoir à recréer mes threads. Donc je veux les réutiliser.

    Voilà schématiquement ce que j'ai fait :
    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
    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
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
     
    public class MaClasse
    {
     
    /** Un objet pour bloquer/débloquer (mettre en attente) la classe mère.*/
    public Object object = new Object() ;
     
    /** Mes threads.*/
    protected MonThread[] threads = null ;
     
     
    public MaClasse(int nbCPU)
    	{
    	threads = new MonThread[nbCPU] ;
    	for (int i=0 ; i < nbCPU ; i++)
    		{
    		threads[i] = new MonThread(this) ;
    		threads[i].start() ;
    		}
    	}
     
     
    public void ExecuterTravail()
    	{
    	while ( EncoreDuTravail )
    		{
    		if ( !ThreadLibre ) // Pas de thread libre => on attend.
    			synchronized ( object )
    				{
    				try	{
    					object.wait() ;
    					}
    				catch ( InterruptedException e )
    					{
    					e.printStackTrace() ;
    					}
    				}
     
    		int free = TrouverUnThreadLibre() ; // On trouve un thread libre
    		DonnerConditionsAuThreadLibre(free) ; // On lui passe les instructions pour le calcul.
     
    		synchronized( threads[free].thread ) // On relance le thread pour le nouveau calcul
    			{
    			threads[free].thread.notify() ;
    			}
    		}
    	}
     
     
     
     
    private class MonThread extends Thread
    {
    /** Pour bloquer/débloquer le thread.*/
    public Object thread = new Object() ;
     
    private MaClasse parent = null ;
     
     
    public MonThread(MaClasse parent)
    	{
    	this.parent = parent ;
    	}
     
     
     
    public void run()
    	{
    	while ( true )
    		{
    		try	{
    			synchronized ( thread )
    				{
    				thread.wait() ; // On bloque immédiatement pour attendre les instructions.
    				}
    			}
    		catch(InterruptedException e)
    			{
    			e.printStackTrace() ;
    			}
     
    		OnFaitLeTravail() ; // Réalisation du boulot par le thread. Durée de 2 à 10 secondes.
     
    		synchronized ( parent.object ) // On relance la classe mère qui attendait un thread de libre.
    			{
    			parent.object.notify() ;
    			}
    		}
    }
     
    }
    En résumé, la classe mère MaClasse débloque les threads lorsqu'elle leur a donné les conditions de travail et chaque thread débloque la classe mère lorsqu'il est libre.

    Est ce que c'est la bonne façon de faire ?
    A mon avis non, mais dans ce cas comment faire ?

    Merci par avance

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Tu peux également regarder du côté de la classe Executors et de ses méthodes statiques de création de pools de threads.

  3. #3
    Membre habitué Avatar de r2d2abc
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 212
    Points : 179
    Points
    179
    Par défaut
    Salut, cet article pourrait t'aider je pense.
    http://rom.developpez.com/java-synchronisation/
    et puis quelques exemples ...
    http://www.java2s.com/Code/Java/Thre...threadpool.htm
    hth...

  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 : 45
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Bonjour,

    merci pour ces liens. Il semblerait que ce que j'ai fait colle avec le tutoriel (utilisation de synchronized).

    Est ce que quelqu'un voit un souci dans ce que j'ai fait ?

  5. #5
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Pourquoi réinventer la roue ? La classe ThreadPoolExecutor fait exactement ce que tu veux.

Discussions similaires

  1. Tri multi-threadé
    Par Tifauv' dans le forum C
    Réponses: 8
    Dernier message: 28/06/2007, 10h00
  2. Programmer des threads
    Par haypo dans le forum C
    Réponses: 6
    Dernier message: 02/07/2002, 14h53
  3. Réponses: 5
    Dernier message: 12/06/2002, 16h12
  4. [Kylix] Pb de Thread !!
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 25/04/2002, 14h53

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