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 :

Différence entre Thread et ThreadLocal


Sujet :

Concurrence et multi-thread Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 106
    Par défaut Différence entre Thread et ThreadLocal
    Bonjour,

    Ça fait longtemps que j'utilise des threads dans mes applications, et j'ai parfaitement l'habitude de travailler avec, mais ce matin, je suis tombé sur le principe de ThreadLocal et là...je suis embrouillé, j'ai du mal à percevoir la différence entre un Thread et un ThreadLocal.

    D'après mes recherches, la différence se ferait au niveau des variables, mais je n'ai pas bien compris la différence.

    Lorsque je lance un thread, par exemple pour gérer le socket d'un client. Ce thread a pour variable le flux d'entrée et le flux de sortie du socket.


    Je pensais que les attributs utilisés étaient déjà exclusif au thread. Alors que si je comprends bien, le ThreadLocal permet d'attacher une variable au thread sans la partager, sinon les autres sont partagés...

    Je pense peut-être avoir trouver la raison, mais je n'en suis pas sur !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MaClasseThread mct = new MaClasseThread();
    Thread T1 = new Thread(mct);
    Thread T2 = new Thread(mct);
    Dans ce cas là, les attributs d'objet mct sont partagés entre les 2 threads.

    Par contre, si je fais ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Thread T1 = new Thread(new MaClasseThread());
    Thread T2 = new Thread(new MaClasseThread());
    Les attributs ne se partagent vu que c'est pas le même objet.

    L'interêt d'un ThreadLocal est donc lors de l'exécution d'un même objet par plusieurs thread. Et dans ce cas, précis, les variables sont modifiables par les 2 threads. J'ajouterais que la variable en threadLocal se libère à la fin de la méthode run() de MaClasseThread.

    Merci de votre apport à ma compréhension.

    Fantomasmusic.

  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 : 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
    Par défaut
    Citation Envoyé par fantomasmusic Voir le message
    j'ai du mal à percevoir la différence entre un Thread et un ThreadLocal.
    çà a autant à voir que le cageot à pomme et le pot de compote on à voir entre eux. (leur seul point commun, la pomme :p)

    Un thread c'est un contexte qui possède du code et s'exécute en parallèle avec d'autres Thread. Visiblement, ça, tu maitrise

    ThreadLocal est un type de variable destiné à contnir un valeur différente suivant le Thread qui effectue des opérations dessus. L'avantage en est de pouvoir stocker cela dans un objet partagé entre tous les Thread, tout en y maintenant une information qui est spécifique à chaque Thread l'utilisant.

    Exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public class Machin {
        public static ThreadLocal status = new ThreadLocal();
    }
     
     
    Thread1:
       Machin.status.set(truc);
       truc = (Truc) Machin.status.get();
     
     
    Thread2:
       Machin.status.set(truc2);
       truc2 = (Truc) Machin.status.get();
    Les deux Threads ne se marcheront jamais sur les pieds (Thread1 obtiendra toujours truc et Thread2 truc2)

    Un des avantages c'est de pouvoir stocker dans une classe globale un contexte important, que beaucoup de méthodes utilise dans différents objet, sans avoir à créer une longue chaine d'appel où ce contexte est présent à chaque fois.

    imagine la ThreadLocal comme étant un peu l'équivalent d'un
    HashMap<Thread,Object>, sans effet de bord et beaucoup plus performant qu'une HashMap!

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 106
    Par défaut
    merci tchize_ pour ta réponse.

    Bonne journée !

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 17/08/2010, 11h57
  2. [Thread] différence entre les méthodes start/run
    Par maetalkrio dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 20/10/2009, 17h06
  3. Différence entre un thread et un backgroundworker
    Par istace.emmanuel dans le forum C#
    Réponses: 2
    Dernier message: 17/10/2009, 09h32
  4. Réponses: 5
    Dernier message: 14/08/2008, 11h25
  5. Différence entre process et thread
    Par Mastero dans le forum MFC
    Réponses: 6
    Dernier message: 19/07/2005, 13h52

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