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 :

Méthodes THREAD dépréciées


Sujet :

Concurrence et multi-thread Java

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

    Informations forums :
    Inscription : Juillet 2003
    Messages : 97
    Par défaut Méthodes THREAD dépréciées
    Bonjour
    J'ai vu que les méthodes stop, suspend et resume étaient dépréciées, mais il n'y a pas a priori de remplacement.
    Comment puis-je suspendre, stopper ou reprendre, à partir d'une IHM, un thread fils si ce n'est en utilisant ces méthodes?

    merci

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Par défaut
    FAQ

  3. #3
    Membre confirmé Avatar de fomazou
    Inscrit en
    Mars 2004
    Messages
    220
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 220
    Par défaut J'ai vu que les méthodes stop...
    tu peux ecrire un code qui realise le stop()

    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
     
    private boolean stop = false;
     
    public void run() {
            boolean termine = false;
     
            while( !termine ) {
                    try {
                            // traitement de chaque thread
     
                            synchronized(this) {
                                    Thead.yield();
     
                                    // lecture du boolean 
                                    termine = this.stop;
                            } 
                    } catch( InterruptedException e ) {
     
                    } 
            } 
    } 
     
    public synchronized void stop() {
            this.stop = true;
    }

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 67
    Par défaut
    Cette méthode fonctionne uniquement si le code de la méthode run() autorise un test régulier d'un boolean. On n'obtiendra jamais un arrêt instantanné de l'exécution du thread.

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Par défaut
    Citation Envoyé par fomazou Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
       ...
       // traitement de chaque thread                        
       synchronized(this)  {
         Thead.yield();                                
         // lecture du boolean 
         termine = this.stop;
       } 
       ...
    }
    Je n'avais pas vu la première fois, mais faire un Thread.yield() n'a pas beaucoup d'interet, surtout la ou il est place. Parce que si c'est pour donner une meilleur chance aux autres threads d'arreter celui-ci, c'est loupé, comme le monitor est déjà pris.
    Sinon, si c'est pour donner la main aux autres threads de temps et en temps, c'est également inutile. Il vaut mieux laisser la vm faire le boulot.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 97
    Par défaut
    J'ai regardé dans la faq.Bon pour le stop OK mais pour la pause. Je souhaiterais réellement le mettre en pause. Est-il envisageable d'utiliser un wait et de le réveiller de l'extérieur par un notify.
    Est-ce propre?

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Par défaut
    Est-il envisageable d'utiliser un wait et de le réveiller de l'extérieur par un notify.
    Est-ce propre?
    Oui, c'est effectivement ce qu'il faut faire.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 97
    Par défaut
    Je n'arrive pas à générer à appeler mes méthodes.
    L'ihm est vivant car les boutons changent d'aspect lorsque la souris est dessus ou lorsque je clique dessus.
    Le pb est que j'ai l'impression et même la certitude qu'il ne rentre pas dans la méthode.

    voici le code de la méthode appelée pour l'événement "mouseClicked"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    private void btnStopStateChanged(java.awt.event.ItemEvent evt) {                                     
    // TODO add your handling code here:
            if(rn!=null)
            {
                btnLance.setEnabled(true);
                btnPause.setEnabled(false);
                btnStop.setEnabled(false);
     
                rn.stoppe();
            }
        }
    }

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Par défaut
    Peux tu poster le code de stoppe() et la synchron du thread stp?

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 97
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public synchronized void stoppe()
        {
            this.stopThread=true;
        }
    le code suivant est dans une fonction appelée dans la méthode run.
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    public void melangeVecteurParams()
        {
            int n1;
            int e;
            boolean stop=false;
            ParamEspece pe1,pe2,peAux;
     
            ihm.setValMinMaxMelange(0,params.size()-1);
            ihm.setTextZoneInfos("Début mélange des paramètres\n");
            e=0;
            while((e<params.size()) && (stop==false))
            {
     
                ihm.setValMelange(e);
                // Recherche d'un emplacement aléatoire pour faire l'échange
                do
                {
                    n1=(int)(java.lang.Math.random()*params.size());
                }while((n1>params.size()-1)||(n1==e));
     
                pe1=(ParamEspece)params.get(n1);
                pe2=(ParamEspece)params.get(e);
     
                params.set(e,(Object)pe2);
                params.set(n1,(Object)pe1);
                /*try {
                    this.sleep(100);
                } catch (InterruptedException ex) {
                    ex.printStackTrace();
                }*/
                synchronized(this)
                {
                    stop=this.stopThread;
                    this.yield();
                }
                e++;
            }
            if(stop)
            {
                ihm.setTextZoneInfos("Mélange des paramètres stoppé\n");
                acquitteStop(); // pour remettre à false le stopThread
            }
            else
                ihm.setTextZoneInfos("Fin mélange des paramètres\n");
        }

  11. #11
    Membre émérite
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Par défaut
    Je ne vois pas ce qui ne va pas.
    Si tu ne rentres pas dans stoppe (j'imagine que tu as verifie avec des traces ou au debugger), c'est que le verrou est déjà pris, et il faut trouver par qui.
    Juste un truc, le Thread.yield() n'a pas de raison d'être dans le bloc synchronized.

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 97
    Par défaut
    bon il y avait une erreur de ma part

    j'ai tracé et jai relevé le pb suivant. Tout d'abor le code que j'ai dans un fonction appelée par la méthode run.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    while((e<params.size())&&(stop==false))
                {
                    .....
     
     
                    synchronized(this)
                    {
                        stop=stopThread;
                        //pause=pauseThread;
                        this.yield();
                    }
                    e++;
                }
    et le code de la méthode appelée par l'ihm
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public synchronized void stoppe()
        {
            synchronized(this)
            {
                this.stopThread=true;
            }
        }
    Le stopThread passe bien à 1, mais lorsque je suis dans la 1ère fct il n'est plus à 1 mais à 0.

Discussions similaires

  1. [Débutant] La méthode Thread
    Par Mag007 dans le forum Concurrence et multi-thread
    Réponses: 5
    Dernier message: 01/04/2007, 19h03
  2. [Thread] Invocation méthode pendant un certain temps
    Par the java lover dans le forum Concurrence et multi-thread
    Réponses: 11
    Dernier message: 01/02/2006, 18h11
  3. [Thread]Faut-il boucler la méthode run ?
    Par Pill_S dans le forum Concurrence et multi-thread
    Réponses: 6
    Dernier message: 17/06/2004, 22h53
  4. thread et méthodes static
    Par sylpichard dans le forum MFC
    Réponses: 3
    Dernier message: 02/06/2004, 17h12
  5. [SWING][THREAD]Méthodes pour afficher une Frame
    Par pompidouwa dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 05/05/2004, 10h35

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