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écupérer la valeur d'une variable d'un Thread en temps réel..?


Sujet :

Java

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Cimentage
    Inscrit en
    Septembre 2014
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Cimentage
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Septembre 2014
    Messages : 44
    Points : 30
    Points
    30
    Par défaut Récupérer la valeur d'une variable d'un Thread en temps réel..?
    Bonsoir à tous,

    Je viens à vous car cette fois-ci, je suis confronté à un grand point d'interrogation..!

    Je me demande comment faire pour récupérer la variable d'un Thread en temps réel, je m'explique :

    Voici mon Thread :

    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
     
    public class Test extends Thread{
     
    int VARIABLE = 0;
     
    public void run(){
     
    try{
    Thread.sleep(30);
    }catch (InterruptedException IE) { IE.printStackTrace(); }
     
    for ( int x = 10; MAVARIABLE < x ; MAVARIABLE++ ){
    System.out.println("Valeur interne : "+MAVARIABLE );
    }
     
    public int getVar(){ 
    return MAVARIABLE; 
    }
     
    }
    }
    Et je voudrais, en temps réelle dans une boucle, récupérer et afficher la valeur de MAVARIABLE grâce à son Getter getVar() dans ma classe Main cette fois-ci..!

    Voici ma Main :

    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 Main{
     
    public static void main(String[] args) {
     
    Test T = new Test();
    Thread TH = new Thread(T);
    TH.start();
     
    for ( i = 0 ; i < 10 ; i++){
    System.out.println("Variable contenue dans le Thread : "+T.getVar());
    }
     
    }
    Ma variable s'incrémente dans la méthode run() du Thread mais je n'arrive pas à la récupérer pour l'afficher dans ma classe Main... comment faire ?

    Merci à vous, bise à tous !

  2. #2
    Modérateur
    Avatar de Gugelhupf
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    Décembre 2011
    Messages
    1 320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste Programmeur

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 320
    Points : 3 741
    Points
    3 741
    Billets dans le blog
    12
    Par défaut
    Bonsoir,

    Tu peux utiliser le design pattern Observer où ton thread jouerait le rôle d'Observable, ainsi à chaque variation de ta valeur tu pourras notifier les observers.
    Voici un tutoriel developpez pour te guider : http://gscheibel.developpez.com/articles/observer/
    Ce dernier utilise lui aussi les threads.

    A+
    N'hésitez pas à consulter la FAQ Java, lire les cours et tutoriels Java, et à poser vos questions sur les forums d'entraide Java

    Ma page Developpez | Mon profil Linkedin | Vous souhaitez me contacter ? Contacter Gokan EKINCI

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Cimentage
    Inscrit en
    Septembre 2014
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Cimentage
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Septembre 2014
    Messages : 44
    Points : 30
    Points
    30
    Par défaut
    Salut Gugelhupf :-)

    Merci à toi pour ta réponse !

    Personnellement, je ne trouve pas ce cours très bien expliqué, je n'arrive pas à saisir, faute d'avoir essayé de lire, lire, lire et rere-lire le fonctionnement du design pattern Observer.. serait-il possible d'avoir un micro-micro-micro exemple réduit à sa plus grande simplicité.. ?

    Merci beaucoup :-)

  4. #4
    Modérateur
    Avatar de Gugelhupf
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    Décembre 2011
    Messages
    1 320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste Programmeur

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 320
    Points : 3 741
    Points
    3 741
    Billets dans le blog
    12
    Par défaut
    Bonjour FrostfallDelphi,

    Si tu es patient, je te donne une réponse plutôt courte, claire et détaillée ce soir (je mettrai à jour ce post).

    A+
    N'hésitez pas à consulter la FAQ Java, lire les cours et tutoriels Java, et à poser vos questions sur les forums d'entraide Java

    Ma page Developpez | Mon profil Linkedin | Vous souhaitez me contacter ? Contacter Gokan EKINCI

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Cimentage
    Inscrit en
    Septembre 2014
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Cimentage
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Septembre 2014
    Messages : 44
    Points : 30
    Points
    30
    Par défaut
    Salut Gugel :-)

    Merci vraiment infiniment, c'est très aimable de ta part, le concept des Design Pattern me parait encore un peu vague dans mon esprit.. Mais un très simple exemple peut être l'amorçage d'une compréhension plus élargie par la suite :-) ( Et oui, je fonctionne souvent comme ça..! )

  6. #6
    Modérateur
    Avatar de Gugelhupf
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    Décembre 2011
    Messages
    1 320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste Programmeur

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 320
    Points : 3 741
    Points
    3 741
    Billets dans le blog
    12
    Par défaut
    Bonsoir,

    J'ai créé un petit article sur le design pattern Observer : http://www.developpez.net/forums/blo...tern-observer/
    Pour ton exemple, remplace ma classe Worker par ta classe Test qui hérite de Thread, et ma méthode work() par ton run() (sans oublier d'appeler la méthode pour notifier, comme dans l'exemple), ce sera plus clair pour toi.
    Comme la valeur que tu souhaites notifier est un int, au niveau des generics utilise Integer.

    Je pense que l'exemple devrait être assez clair, mais n'hésite pas si tu as des questions

    A+
    N'hésitez pas à consulter la FAQ Java, lire les cours et tutoriels Java, et à poser vos questions sur les forums d'entraide Java

    Ma page Developpez | Mon profil Linkedin | Vous souhaitez me contacter ? Contacter Gokan EKINCI

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Cimentage
    Inscrit en
    Septembre 2014
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Cimentage
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Septembre 2014
    Messages : 44
    Points : 30
    Points
    30
    Par défaut


    HALLELUJAH Gugelhupf !
    Alors là, tu es vraiment un Ange, c'est génialissimme, tout ça pour un parfait inconnu comme moi et beh...!

    Dés que j'ai accès à mon PC, je m'y colle ILLICO-PRESTO, je vais me délecter de cette bonne lecture et la savourer comme il se doit :-D

    Je te tiens au jus :-)

    Encore MERCI !!

  8. #8
    Modérateur
    Avatar de Gugelhupf
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    Décembre 2011
    Messages
    1 320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste Programmeur

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 320
    Points : 3 741
    Points
    3 741
    Billets dans le blog
    12
    Par défaut
    De rien, n'hésite pas à dire si tu bloques
    N'hésitez pas à consulter la FAQ Java, lire les cours et tutoriels Java, et à poser vos questions sur les forums d'entraide Java

    Ma page Developpez | Mon profil Linkedin | Vous souhaitez me contacter ? Contacter Gokan EKINCI

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    156
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 156
    Points : 165
    Points
    165
    Par défaut
    Vu ton code je ne sais pas si tu voulais être notifié des changements de la variable présente dans ton thread ou si tu voulais juste pouvoir lire la valeur de la variable dans ton thread à tout moment. Si c'est la première option, La réponse de Gugelhupf est la bonne mais pour la seconde, il faut plutôt quelque chose du genre volatile int VARIABLE = 0; (mais il faut aussi que ton main ne fasse pas un boucle plus courte que ton second thread comme c'est le cas dans ton code).

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2016
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juin 2016
    Messages : 16
    Points : 8
    Points
    8
    Par défaut
    je sais que c est pas bien de reprendre un vieux post,mais je suis face au meme probleme ou j essaye de recuperer une valeur dans un thread,sans y arriver;helas,il n y pas ici le code solutionné,et je n arrive pas a le faire et que ca marche;si quelqu un pouvait mettre ici le code complet du probleme de depart ,ca serait sympa; d avance merci

  11. #11
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    461
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 461
    Points : 894
    Points
    894
    Billets dans le blog
    5
    Par défaut
    Ne jamais utiliser les Thread. Réimplémenter les Thread, c'est le mal.

    Il faut différentier la tâche et la façon dont la tâche est exécuté.

    Ça tombe bien, c'est très bien fait dans le framework de base concurrence.

    La tache de base c'est un Runnable:
    https://docs.oracle.com/javase/7/doc.../Runnable.html

    Pour lancer, on utilise un Executor:
    https://docs.oracle.com/javase/7/doc...orService.html

    https://docs.oracle.com/javase/7/doc...Executors.html

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ExecutorService executor = Executors.newSingleThreadExecutor();
    executor.submit(runnable);
    A la fin, il faut fermer l'executor:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    executor.shutdown();
    Dans ton cas, tu retourne une valeur.

    Ce qui est bien, c'est que le framework executor le permet avec Callable qui retournera un Future qui permettra d'avoir le résultat.
    Soit pour un Integer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     Callable<Integer> monCallable = new monCallable();
     
    ExecutorService executor = Executors.newSingleThreadExecutor();
     
    Future <Integer> monFuture = executor.submit(runnable);
     
    Integer monResultat = monFuture.get();
     
    executor.shutdown();
    Enfin je conclurai que dans la programmation concurrente, en général et en Java en particulier est un domaine difficile.

    Il faut avoir des notions solides dedans.

    Cordialement.

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2016
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juin 2016
    Messages : 16
    Points : 8
    Points
    8
    Par défaut
    merci de la reponse,mais la, moi je suis un amateur et c est trop compliqué;y a pleins de trucs dont j ignorais l existence, alors ,deja que je pataugais avec les precedentes reponses, là ca depasse mes competences,si encore j en avais quelques unes

  13. #13
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    461
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 461
    Points : 894
    Points
    894
    Billets dans le blog
    5

Discussions similaires

  1. Réponses: 8
    Dernier message: 02/10/2006, 17h16
  2. Réponses: 7
    Dernier message: 16/06/2006, 16h31
  3. Récupérer la valeur d'une variable d'environnement
    Par poca10 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 15/02/2006, 10h23
  4. Réponses: 1
    Dernier message: 21/11/2005, 12h07
  5. Récupérer la valeur d'une variable distante
    Par seblo_scoqi dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 14/09/2005, 16h10

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