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 :

[Thread] Stop dépréciée, que faire?


Sujet :

Concurrence et multi-thread Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Inactif
    Inscrit en
    Octobre 2005
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Octobre 2005
    Messages : 150
    Par défaut [Thread] Stop dépréciée, que faire?
    Bonjour,

    j'utilise la jdk 1.5 et la méthode stop() y est dépréciée. Quelle méthode utiliser pour arrêter mon processus sachant qu'après je veux pouvoir refaire un start() sans générer d'exception?

  2. #2
    Inactif
    Inscrit en
    Octobre 2005
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Octobre 2005
    Messages : 150
    Par défaut
    je précise qu'après avoir stoper mon processus, quand je fais un start() dessus j'obtiens une exception : IllegalThreadStateException

  3. #3
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut Re: [Thread] Stop dépréciée, que faire?
    Salut,

    Citation Envoyé par the_ugly
    j'utilise la jdk 1.5 et la méthode stop() y est dépréciée. Quelle méthode utiliser pour arrêter mon processus sachant qu'après je veux pouvoir refaire un start() sans générer d'exception?
    La méthode start() d'un thread ne peut être appellé qu'une seule fois. Il te faut donc recréer un nouvel objet Thread...

    Sinon je te conseille de jeter un coups d'oeil à la FAQ : Gestion des threads ainsi qu'au tutoriel d'Alwin : Programmation des Threads en Java...

    a++

  4. #4
    Inactif
    Inscrit en
    Octobre 2005
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Octobre 2005
    Messages : 150
    Par défaut
    Merci, ça marche maintenant.

  5. #5
    Membre émérite

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 882
    Par défaut Re: [Thread] Stop dépréciée, que faire?
    Citation Envoyé par adiGuba
    Salut,

    Citation Envoyé par the_ugly
    j'utilise la jdk 1.5 et la méthode stop() y est dépréciée. Quelle méthode utiliser pour arrêter mon processus sachant qu'après je veux pouvoir refaire un start() sans générer d'exception?
    La méthode start() d'un thread ne peut être appellé qu'une seule fois. Il te faut donc recréer un nouvel objet Thread...[/url][/b]...

    a++
    AdiGuba a raison, il faut noter tout de même que la création d'un Thread est assez couteuse.
    Ainsi, lorsque tu as beaucoup de Threads à créer il est recommandé d'utiliser un pool de Threads

  6. #6
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 900
    Billets dans le blog
    54
    Par défaut
    Et la methode interrupt() alors ?

    Moi ca ca bien faire 7~8 ans que j'utilise un truc comme ca dans mes classes :

    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
     
      Thread thread;
     
      /** Starts the thread.
       * <BR>The task will start if it is not already running.
       */
      public synchronized void start() {
        if (thread == null) {
          thread = new Thread(runnable, name);
          thread.setPriority(Thread.NORM_PRIORITY);
          thread.start();
        }
      }
     
     
      /** Stops the thread if it is not already running.
       * <BR>The task will be stopped if it is not already stoppped.
       */
      public synchronized void stop() {
        if (thread != null) {
          thread.interrupt();
          thread = null;
          notify();
        }
      }
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  7. #7
    Inactif
    Inscrit en
    Octobre 2005
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Octobre 2005
    Messages : 150
    Par défaut
    Citation Envoyé par bouye
    Et la methode interrupt() alors ?

    Moi ca ca bien faire 7~8 ans que j'utilise un truc comme ca dans mes classes :

    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
     
      Thread thread;
     
      /** Starts the thread.
       * <BR>The task will start if it is not already running.
       */
      public synchronized void start() {
        if (thread == null) {
          thread = new Thread(runnable, name);
          thread.setPriority(Thread.NORM_PRIORITY);
          thread.start();
        }
      }
     
     
      /** Stops the thread if it is not already running.
       * <BR>The task will be stopped if it is not already stoppped.
       */
      public synchronized void stop() {
        if (thread != null) {
          thread.interrupt();
          thread = null;
          notify();
        }
      }
    thread.interrupt() et thread=null ne marchaient pas (mon thread était un chrono et il continuaot inéxorablement à avancer dans le temps).

    Par contre j'ai utilisé un booléen initialisé à true dans la boucle while et ma méthodes stop consiste à mettre ce booléen à false. Ca marche et c'est joli.

  8. #8
    Gfx
    Gfx est déconnecté
    Expert confirmé
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Par défaut
    Fais attention avec un boolean. Si tu y accedes depuis un thread exterieur cela ne marchera pas dans certain cas. Tu dois le declarer volatile.

    Personnellement j'ai pour habitude d'utiliser interrupt() et l'affectation a null en interceptant l'exception InterruptedException dans la boucle principale de mon thread (si j'utilise un sleep). Sinon en effet il faut utiliser un truc semblable au tien.

  9. #9
    Inactif
    Inscrit en
    Octobre 2005
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Octobre 2005
    Messages : 150
    Par défaut
    volatile, ça veut dire quoi exactement?

  10. #10
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par the_ugly
    volatile, ça veut dire quoi exactement?
    FAQ : Que signifie le mot-clé volatile ?.

    Pour faire bref cela permet de forcer à vérifier la valeur exacte de la variable à chaque fois qu'elle en a besoin... Sinon le compilateur et/ou la JVM d'optimiser le code pour pour des traitements single-thread...

    a++

  11. #11
    Inactif
    Inscrit en
    Octobre 2005
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Octobre 2005
    Messages : 150
    Par défaut
    ok merci. En gros cela permet de synchroniser l'accès à la varaible. Mais dans mon cas il n'y a qu'un thread qui modifie cette valeur, donc ce n'est pas utile mais je l'ai quand même mis pour m'en souvenir plus tard

  12. #12
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par the_ugly
    ok merci. En gros cela permet de synchroniser l'accès à la varaible. Mais dans mon cas il n'y a qu'un thread qui modifie cette valeur, donc ce n'est pas utile mais je l'ai quand même mis pour m'en souvenir plus tard
    Non cela ne permet pas de synchronizer (la synchonisation empêche les acces concurrent) ! Cela indique au compilateur et/ou à la JVM que ce champs peut être modifié par différents threads.

    Si tu ne met pas volatile tu peux avoir des problèmes à cause des optimisations du compilateur et/ou de la JVM.

    Imagine ton thread comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public boolean running = true;
     
    public void run() {
     
    	while (running) {
     
    		// Traitement ...
    	}
    }
    Et dans ton thread principale tu modifies le champs à false, ce qui devrait arrêter le traitement lors du prochain passage dans le while()...


    Or il n'en est rien* car le compilateur et/ou la JVM peut optimiser le code de ta méthode run() en considérant qu'il est mono-thread. Ainsi si dans ton traitement tu ne modifies pas la valeur de running, ils considèrent que la valeur ne peut pas changer et elle ne sera interprété qu'une seule fois (lors de la première entrée dans le while). Du coup le changement de valeur opéré dans l'autre thread passe à la trappe...

    a++

    * : En fait cela dépend de ta JVM, cela peut marcher comme ca peut boucler à l'infini... donc il est preferable d'utiliser volatile pour être sur du comportement...

  13. #13
    Inactif
    Inscrit en
    Octobre 2005
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Octobre 2005
    Messages : 150
    Par défaut
    Même si l'autre Thread appelle une méthode setBoolean cela peut boucler à l'infini?

  14. #14
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par the_ugly
    Même si l'autre Thread appelle une méthode setBoolean cela peut boucler à l'infini?
    Oui car la JVM peut optimiser les méthodes indépendamment en restant sur une logique mono-thread, donc le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public void run() {
     
       while (running) {
     
          // Traitement ...
       }
    }
    Peut être optimisé à la volé en quelque chose de "similaire" à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public void run() {
     
       while (true) {
     
          // Traitement ...
       }
    }
    Mais comme je l'ai dit cela n'est pas obligatoire et peut varier d'une JVM à l'autre...

    Ce type d'optimisation permet d'éviter d'avoir à faire de multiple accès à la valeur d'une variable et peut permettre quelque gain de temps, mais peut provoquer des problèmes en multi-thread d'où l'utilité de volatile...



    De plus dans 99% des cas passer par une méthode mutateurs ne change rien car il y a de forte chance qu'elle soit traiter comme une méthode inline à l'exécution, ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monObject.setBoolean(false);
    a de forte chance d'être "remplacer" par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monObject.booleen = false;
    a++

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

Discussions similaires

  1. Que faire une fois le thread exécuté ?
    Par Coussati dans le forum Langage
    Réponses: 10
    Dernier message: 09/12/2014, 19h47
  2. Les PC sont de plus en plus bruyants que faire
    Par plichtal dans le forum Ordinateurs
    Réponses: 260
    Dernier message: 23/12/2011, 12h28
  3. [DirectDraw] Que faire pour optimiser le rendu ???
    Par mat.M dans le forum DirectX
    Réponses: 8
    Dernier message: 12/12/2003, 18h02
  4. [maintenance][performance] Que faire comme maintenance ?
    Par woodwai dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 06/11/2003, 15h39

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