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]Faut-il boucler la méthode run ?


Sujet :

Concurrence et multi-thread Java

  1. #1
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut [Thread]Faut-il boucler la méthode run ?
    bonsoirs à tous,

    j'essaie de comprendre le principe des threads, et c'est pas évident lol

    je me demandais ce qu'il fallait faire dans la méthode run() d'un objet implémentant "Runnable" (j'ai honte)

    - faut-il boucler les actions avec une boucle infinie? genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      public void run(){
        do{
          //actions
        }while(1!=2);
      }
    - faut-il attendre avec Thread.sleep(); pendant la boucle?
    - la méthode "main", c'est bien un thread à part ?

    pour tout dire je suis en train de faire un Chronometre, et sa méthode run() ne fait que mettre à jour le contenu de différentes variables... Mais une fois que je la lance, tout le reste se bloque

    dans le main je fais comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      ...
      Thread th = new Thread(Chronometre);
      th.run();  // <-- reste bloqué ici
      ...

    Vous avez une idée ?

  2. #2
    duj
    duj est déconnecté
    Membre confirmé

    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2003
    Messages : 141
    Points : 474
    Points
    474
    Par défaut
    Salut,

    tu dois appeler la methode start et pas run (mais tu dois bien implémenter run )


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Thread th = new Thread(Chronometre); 
      th.start();  // <-- restera plus  bloqué ici

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2002
    Messages : 652
    Points : 1 151
    Points
    1 151
    Par défaut
    Quelques petites choses.

    Pour une boucle infinie, fait plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      while(true) {
        ...
      }
    Autre chose d'important, pour lancer un thread, tu DOIT utiliser la méthode start() et non run().

    Dernier point, Runnable est une interface spécifiant que ta classe dispose d'une méthode run(), MAIS, un Runnable n'est pas un Thread !


    La boucle a utiliser si tu n'a pas de condition de sortie pour un Thread est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      while (!isInterrupted()) {
        ...
      }
    La méthode main() est en effet lancée sur un Thread a part !
    Le Thread principal.

    Pour proprement temporiser un Thread, n'utilise surtout pas Thread.sleep(x) mais Thread.currentThread().sleep();
    Ainsi tu est sur que c'est bien le Thread en cours que tu temporise.

    Voila, jette un oeil aux méthode wait(), notify(), notifyAll() et join()
    Elle peuvent être utiles aussi

  4. #4
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    merci duj ! y'a pas à dire, c'est quand même con une erreur de débutant...

    Alwin: oui j'avais plus ou moins compris, d'ailleurs on passe un objet implémentant Runnable comme paramètre à un Thread... fo encore que je me fasse au vocabulaire... hihihi

    par contre pour la boucle infinie, mon prof m'a toujours dit de "plutôt faire des conditions booléennes découlant d'une vérité mathématique telle que 1!=2, etc... parce que parait-il que ça veut rien dire while(true)-- mais qu'est-ce qui est true?? -- blabla blabla..." enfin je vais pas entré dans un débat mais c'est les grandes théories de mon prof

    en tout cas merci les gars, comme d'hab j'étais resté bloqué sur une broutille...

    [EDIT]
    'tite question: c'est normal que j'aie un message "l'accès à la méthode statique Thread.currentThread().sleep doit se faire de manière statique" ? (placé dans la méthode run()) ?

  5. #5
    Membre régulier Avatar de kaisse
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 100
    Points : 117
    Points
    117
    Par défaut
    'tite question: c'est normal que j'aie un message "l'accès à la méthode statique Thread.currentThread().sleep doit se faire de manière statique" ? (placé dans la méthode run()) ?
    Oui et c'est un piege ou je me faisais avoir. La méthode sleep(long) est une méthode statique de la classe Thread. Or quand j'étendais un Thread, je mettais this.sleep(1000); ce qui était syntaxiquement correcte, mais du coup j'étais persuadé qu'il s'agissait d'une méthode d'instance, alors que c'est une méthode de classe.

    Donc le bon appel, quelque soit le thread depuis lequel tu la lances, c'est Thread.sleep(/* durée */);
    Attention cependant, tu ne peux que faire patienter le Thread courant, et pas un autre thread de cette maniere, en gros tu ne peux pas faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Thread t = new Thread (myRunnable);
    t.start();
    t.sleep(1000);
    Disons que c'est syntaxiquement correct, mais ca devrait soulever un warning du genre que tu as eu. Et surtout ca ne va pas faire patienter t, mais le thread courant. Pour faire faire des pauses à ton thread, il faut que tu fasses preuve d'astuce dans ta méthode run, en créant des boucles sensibles aux appels de méthode stop et start à l'aide d'un boolean qui indique si le thread est actif ou pas par exemple ;-)

    Bon courage

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2002
    Messages : 652
    Points : 1 151
    Points
    1 151
    Par défaut
    Pour revenir aux boucle infinie, si un true seul ne veux rien dire, donne celle-ci à ton prof


  7. #7
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Citation Envoyé par Alwin
    ouais, c'est vrai que dans le genre "code à n'y rien piger" on peut aller loin... comme l'histoire du gars qu'écrivait ses programmes sans indenter...

    m'enfin chacun ses habitudes

    en tout cas merci, ça commence à entrer dans la caboche

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 20/05/2014, 13h21
  2. [Thread] Un thread sans méthode run()
    Par igor24 dans le forum Concurrence et multi-thread
    Réponses: 4
    Dernier message: 11/03/2008, 10h43
  3. Peux-t-on surcharger la méthode run() d'un thread ?
    Par Pirokkk dans le forum Concurrence et multi-thread
    Réponses: 9
    Dernier message: 30/12/2007, 13h53
  4. Remonter une exception de la méthode Run() ?
    Par Jonef dans le forum Interfaces Graphiques en Java
    Réponses: 5
    Dernier message: 30/01/2007, 23h06
  5. fonctionnent de la méthode run dans les threads
    Par L4BiN dans le forum Concurrence et multi-thread
    Réponses: 8
    Dernier message: 25/07/2006, 12h06

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