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

API standards et tierces Java Discussion :

[ThreadGroup] Endormir un groupe de tâches [Trucs & Astuces]


Sujet :

API standards et tierces Java

  1. #1
    Futur Membre du Club
    Inscrit en
    Janvier 2004
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 4
    Par défaut [ThreadGroup] Endormir un groupe de tâches
    Bonjour !

    J'ai dans un programme, 2 objets qui appartienent a 2 Thread diffrérents, mais qui tout 2 sont rattaché a un même groupe (dans un ThreadGroup donc...).

    Je voudrais savoir si il serait possible de mettre en "pause" tout le groupe pendant une durée de "x" milisecondes, au même titre que l'on peut le faire avec un threads unique ex : Thread.sleep(500)

    egalement, pour mettre en pause l'un et l'autre de mes thread, je n'ai pas trouvé mieux que cette methode en mettant continuellment mon thread a sleep(1) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     public void run() {
      while (true) {
       methodeAExecuter();
       try { 
        this.sleep(5);   
        while (boolean b != true) {    
         this.sleep(1);	 
        }   
       } catch (InterruptedException e) {}
      }   	
     }
    Même si cela fonctionne, est ce que c'est bien propre comme solution ?

    Merci

  2. #2
    Membre éclairé
    Inscrit en
    Avril 2003
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 52
    Par défaut
    NON. Il n'est pas possible, depuis l'extérieur, de modifier le déroulement d'un thread. Toutes les méthodes qui le pouvait sont deprecated depuis longtemps, et la règle est que un thread ne peut influer que sur lui même. La seule exception est notify, et encore, cela se discute.

    Le sleep n'est pas une bonne solution pour endormir un thread, car son comportement vis à vis des threads n'est pas défini ; en particulier, on ne sait pas si endormir signifie passer la main à un autre thread ou cesser l'exécution du programme. Donc il vaut mieux utiliser wait.

  3. #3
    Futur Membre du Club
    Inscrit en
    Janvier 2004
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 4
    Par défaut
    Ok, donc j'ai changé mon sleep(1) par un wait() mais maintenant comment faire pour relancer mon thread ??? Une fois en attente, impossible de le relancer. J'utilise pourtant un notify() [essayé aussi notifyAll()] mais mon thread ne se relance pas.

    Y a t'il un endroit en particulier pour placer cette methode notify() ? Actuellement elle est située dans un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public void keyPressed(KeyEvent klevt) {}
    qui si trouve dans la classe principale de mon programme.

    Mes methodes run() avec mon wait() sont elles, dans 2 autres classes independantes qui heritent toutes les 2 de Thread.

    Voila, en esperant que tu sauras m'aider

  4. #4
    Membre Expert
    Avatar de Ioan
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    737
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 737
    Par défaut
    Bonjour,
    Tu pourrais utiliser la méthode interrupt de la classe ThreadGroup. Ou alors faire une énumération avec enumerate et appliquer un sleep(X) sur chacun des Threads obtenus.
    Bonne chance.
    @+
    Les FAQs Java, J2EE, JDBC, Struts > Les cours > Le Forum Java.
    Merci de respecter les règles du club.
    Mon blog : quelques news sur Java, Linux et le monde de l'Open Source.

  5. #5
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2003
    Messages : 2
    Par défaut
    Tu peux aussi ajouter à ton thread un flag(avec getter/setter) et/ou un délai de réactivation.
    Et tu testes les deux paramètres dans la méthode run() de tes Threads.

    Ensuite comme dis précédemment, tu parcours l'énumération des Threads du ThreadGroup et tu lances pour chacun la méthode setFlag(boolean flag)
    à true ou false suivant si tu veux le faire.

    En gros, tu gère la logique de fonctionnement du thread dans la méthode run() et tu n'intervient que sur des attributs du Thread (ou de classes inhérentes à son utilisation).

  6. #6
    Futur Membre du Club
    Inscrit en
    Janvier 2004
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 4
    Par défaut
    Merci pour vos reponses.

    Pour la gestion du ThreadGroup c'est Ok, je comprend mieux comment je dois procéder maintenant.

    Par contre, pourquoi je n'arrive pas à reprendre mes Threads mis en attente [avec wait()] avec notify() ... Ou faut t il placer notify(), dans un run() obligatoirement, ou n'importe ou dans le programme ???

  7. #7
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2003
    Messages : 2
    Par défaut
    Clairement, tout doit être prévu dans la classe du Thread elle-même, même les appels à notify().

    Donc tu dois avoir une boucle dans ta méthode run()

    par 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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
        private boolean flag=true;
        public void run() {
            try{
                while (this.isUpToDate() && this.flag) {
                        //Traitement ici
                        synchronized (this) {
                            this.wait(LASTING_TIME);
                        }            }
            }catch(Exception e){
            	browseError(this+"Erreur dans la méthode run()",e);
            }
            browse(this +" stopped");
        }
        public boolean isUpToDate(){
            //teste la validité du thread, suivant un critère de durée de vie, ou autre
        }
        public void setFlag(boolean activate){
            this.flag=activate;
            try {
                //	on tente de réveiller le thread
                synchronized (this) {
                    this.notify();
                }
           } catch (Exception e) {/* si le thread est déjà démarré par exemple */}
        }

  8. #8
    Futur Membre du Club
    Inscrit en
    Janvier 2004
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 4
    Par défaut
    C bon ça marche MERCI

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

Discussions similaires

  1. [WS 2008 R2] Stratégie de groupe (services et tâches planifiés)
    Par dietrying dans le forum Windows Serveur
    Réponses: 1
    Dernier message: 03/12/2012, 19h36
  2. Nom groupe de fenêtres dans la barre des tâches
    Par MortDansLAme dans le forum Général Java
    Réponses: 1
    Dernier message: 23/09/2011, 15h26
  3. Regrouper les tâches directes / groupes
    Par romainw dans le forum SharePoint
    Réponses: 4
    Dernier message: 15/04/2008, 11h05
  4. Arrêter / Stopper un groupe de Threads ou ThreadGroup
    Par ouranos21 dans le forum Concurrence et multi-thread
    Réponses: 5
    Dernier message: 09/04/2008, 11h03
  5. Réponses: 5
    Dernier message: 12/03/2008, 09h55

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