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 :

Peux-t-on surcharger la méthode run() d'un thread ?


Sujet :

Concurrence et multi-thread Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 41
    Points : 27
    Points
    27
    Par défaut Peux-t-on surcharger la méthode run() d'un thread ?
    Bonjour,


    Un thread de type "Horloge" tourne. Il increment les jours et les mois.
    J'ai besoin de récupérer en temps réel les valeurs du jour et du mois grâce aux fonctions getJour() et getMois().

    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
    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
    47
    48
    49
     
    public class myThread extends Thread
    {
     
        private int mois;
     
        public myThread(Horloge tHorloge) // tHorloge est un thread
        {  	
        		// Récupération de la premiere valeur trouvée de Mois;
        		mois=tHorloge.getMois();
     
        }
     
     
     
        // Récupération de la valeur du Mois a chaque passage dans la boucle while
        public void getMoisTempsReel(Horloge tHorloge)
        {
        	mois=tHorloge.getMois();
        }
     
     
        public void run ()
    	{
        	try
      	    {
    	      while (this.isAlive ())
    	      {
    	    	//getMoisTempsReel(tHorloge)
     
    	      	if( (mois == 5) || (mois == 10) )
    	        {
    	        	System.out.println("action 1"); 
    	        }
    	      	else
    	      	{
    	      		System.out.println("action 2");
    	      	}
     
    	      	Thread.sleep (500);
    	      }
      	    }
    	     catch (InterruptedException e) { }
     
     
    	}
     
     
    }

    Seulement, la méthode run() ne connaît pas "tHorloge"...
    Comment faire pour récupérer ces valeurs en tems réel ?
    -Peux-t-on surcharger la méthode run() ??
    -Faut-il passer par une variable extern, globale ou static ??


    Merci !

    Pirokkk.

  2. #2
    ndp
    ndp est déconnecté
    Membre actif Avatar de ndp
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 227
    Points : 255
    Points
    255
    Par défaut
    Salut,

    si ton thread a besoin d'une reference a Horloge pour faire son boulot, tu peux simplement definir un attribut Horloge.

  3. #3
    Membre expérimenté
    Avatar de fabszn
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2002
    Messages
    974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2002
    Messages : 974
    Points : 1 638
    Points
    1 638
    Par défaut
    Hello,

    Pour répondre à ta question.. non tu ne peux pas surcharger la méthode run() de la classe...
    Enfin tu peux toujours la surcharger mais elle ne sera pas appelée au démarrage du Thread

  4. #4
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 41
    Points : 27
    Points
    27
    Par défaut
    Absolument gigantesque !!

    Effectivement il suffit de construire une référence pour pouvoir passer des méthodes ou des attributs dans la fonction run !!

    Comme ceci donc :

    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 class myThread extends Thread
    {
     
        private Horloge tmpHorloge;
        private mois;
     
        public myThread(Horloge tHorloge) // tHorloge est un thread
        {  	
        		// Réference sur tmpHorloge
        		tmpHorloge = tHorloge;
     
        }
     
     
     
     
     
        public void run ()
    	{
        	try
      	    {
    	      while (this.isAlive ())
    	      {
                    // Récupération de la valeur du mois en temps réel
                    mois = tmpHorloge.getMois(); 
     
    	      	if( (mois == 5) || (mois == 10) )
    	        {
    	        	System.out.println("action 1"); 
    	        }
    	      	else
    	      	{
    	      		System.out.println("action 2");
    	      	}
     
    	      	Thread.sleep (500);
    	      }
      	    }
    	     catch (InterruptedException e) { }
     
     
    	}
     
     
    }

    Merci à vous deux pour vos réponses complètes, excusez-moi pour ma question peu réfléchie...!

    Pirokkk.

  5. #5
    Membre expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Points : 3 083
    Points
    3 083
    Par défaut
    Il ne faut pas étendre Thread. Il faut implémenter Runnable et filer ton Runnable à un Thread. C'est plus propre et plus simple.

  6. #6
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 41
    Points : 27
    Points
    27
    Par défaut
    Merci Natha pour ton conseil, j'ai effectivement essayé de faire ça, mais pour l'instant je n'y arrive pas....
    Je sais que c'est plus propre d'étendre Runnable, mais après je me perds pour savoir ou créer le thread...

    Pourrait-tu me donner un exemple, ou te baser sur ce que j'ai fait s'il-te-plait ?

  7. #7
    Membre expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Points : 3 083
    Points
    3 083
    Par défaut
    Tout pareil sauf :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public class myThread implements Runnable
    Et à l'endroit où tu fais :

    Tu changes par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new Thread(myThread).start();
    Enfin comme je sais pas comment tu fais derrière, je peux pas t'en dire plus.

    PS: Essaie de nommer tes classes suivant les recommandations de Sun : commencer par une majuscule, alors que la variable elle commencera par une minuscule : MyThread myThread = new MyThread();

  8. #8
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 41
    Points : 27
    Points
    27
    Par défaut
    Bonjour Natha,

    il me reste un problème, car dans ma classe Horloge extends Thread, j'utilise un run() avec la fonction isAlive().
    On me dit alors que isAlive n'est pas reconnu pour une classe étendue de Runnable().

    La voici :

    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
     
    public class Horloge extends Thread
    {
     
    	// si aucune donné n'est saisi au démarrage, on attribu cette date par défaut
    	private int jour = 20;
    	private int mois = 11;
     
    	String tabMois[] = {"Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Aout", "Septembre", "Octobre", "Novembre", "Décembre"};
     
     
     
    	public void run ()
    	{
    	    try
    	    {
    	      while (this.isAlive ())
    	      {
     
    	        jour++;
            	System.out.println("THREAD Horloge : " + jour + " " +  tabMois[mois]);
     
     
            	if( mois == 11 && jour == 30)
      	        {
      	        	mois = 0;
      	        	jour=0;
      	        	System.out.println("bonne année");
      	        }
     
            	if( jour == 30 )
    	        {
    	        	mois = mois + 1 ;
    	        	jour =0 ;
    	        }
     
    	        Thread.sleep (500);
     
    	      }
    	    }
    	    catch (InterruptedException e) { }
    	  }
     
    }

    Peut-être existe-t-il des fonctions équivalentes avec Runnable() ?

    Pirokkk

  9. #9
    Membre expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Points : 3 083
    Points
    3 083
    Par défaut
    En fait ton Runnable ne fait que définir ce que le thread doit exécuter.
    Pour savoir s'il vit etc. il faut que tu utilises le thread et non le runnable.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    TonRunnable runnable = new TonRunnable();
    Thread th = new Thread(runnable);
    th.start();
    th.isAlive();
    L'avantage c'est aussi que tu pourras exécuter plusieurs fois par exemple ton runnable sans en créer une nouvelle instance.

  10. #10
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 41
    Points : 27
    Points
    27
    Par défaut
    Ok je vois bien le truc la....!!!

    Je suis lancé ! Merci Natha !

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

Discussions similaires

  1. 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, 11h06
  2. [POO] Surcharge de méthode
    Par ouioui2000 dans le forum Langage
    Réponses: 4
    Dernier message: 09/03/2006, 15h25
  3. [Custom Tags] Problème avec une surcharge de méthode
    Par Strab dans le forum Taglibs
    Réponses: 19
    Dernier message: 26/08/2005, 16h34
  4. Comment surcharger la méthode OnClose d'un TFrame ?
    Par sdebrois dans le forum Composants VCL
    Réponses: 2
    Dernier message: 17/01/2005, 20h57
  5. [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

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