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

AWT/Swing Java Discussion :

Débutant avec les Threads


Sujet :

AWT/Swing Java

  1. #1
    Invité
    Invité(e)
    Par défaut Débutant avec les Threads
    Bonjour,

    J'ai étudié les threads dans un livre et avec le tutoriel mais je n'ai pas trouvé de réponse à ma question.

    En exercice, je crée un objet Caisse avec un thread appelant une methode changerposition() et un objet Chien avec un thread appelant une methode sauter().

    Mon programme principal crée un objet Caisse et un objet Chien.

    Ensuite, je ne sais pas utiliser les threads pour qu'au moment où la position de la caisse est comprise entre deux valeurs, le chien saute.

    Pouvez-vous m'aider ?

    Merci

    AdoOs

  2. #2
    Membre Expert
    Avatar de Gueritarish
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 800
    Par défaut
    Salut,

    Si j'ai bien saisi ton problème, tu as une caisse qui avance (??? bizarre) et un chien qui saute quand cette caisse est proche de lui.
    Pourrais-tu déjà poster tes classes Chien et Caisse?

    A+

  3. #3
    Invité
    Invité(e)
    Par défaut
    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
     
     
    public class Caisse extends Thread
    {
     
    private int X, Y, d;
    Visualisation Visue;
     
    public Caisse(int a, int b, Visualisation visue)
    {
    this.X=a;
    this.Y=b;
    this.Visue=visue;
     
    }
     
    public changerposition(int i) 
    {
    this.X=i;
    this.Visue.repaint();
    }
     
    public void run()
    {
    for (int i=0; i<5000; i++)
    {
    d=(int)(Math.random()) ;
     
    changerposition(d) ;
    }
     
    }
     
    }

    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
    public class Chien extends Thread
    {
     
    private int X, Y;
    Visualisation Visue;
     
    public Chien(int a, int b, Visualisation visue)
    {
    this.X=a;
    this.Y=b;
    this.Visue=visue;
    }
     
    public sauter() 
    {
    this.Y=Y+50; // Hauteur de la boite : 50px
    this.Visue.repaint();
    }
     
    public void run()
    {
    for (int i=0; i<5000; i++)
    {
    sauter() ;
    }
    }
    }
    Voilà les deux classes.

    Merci pour ton aide.

  4. #4
    Membre Expert
    Avatar de Gueritarish
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 800
    Par défaut
    Pourquoi tu fais pas un Thread unique qui fais avancer ta boite et qui connaissant la position du Chien le fait sauter quand elle est trop près de lui?
    Je trouve ça un peu plus logique que ce que tu as fais... Mais comme tu dis, tu es débutant, alors ça peut paraitre normal. Tu fais juste 2 classes Chien et Caisse (sans extend Thread) et tu fais une 3ème classe qui hérite de Thread et qui va s'occuper des mouvements de ta caisse et de ton chien.

    t'as suivi ?

  5. #5
    Invité
    Invité(e)
    Par défaut
    J'avais pensé à çà mais le formateur en l'entreprise nous a demandé de réaliser cette exercice en animant caisse par un thread et chien par un thread et en les faisant communiquer.

    Je dois faire çà pour demain après-midi et c'est compliqué.

    C'est pour çà que je demande comment faire pour dire au chien que la caisse est à tel endroit.

    C'est étrange comme exercice quand même.

    J'avais pensé faire une animation graphique mais je pense qu'un rendu texte sera suffisant car j'ai pas trop de temps.

  6. #6
    Membre Expert
    Avatar de Gueritarish
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 800
    Par défaut
    Ah, dans ce cas là, c'est pas du tout pareil. Tu veux faire un système de communication entre thread...
    C'est pas extrèmement étrange (à part le fait que la caisse puisse avancer ), c'est pour t'apprendre la communication entre Thread ^^

  7. #7
    Invité
    Invité(e)
    Par défaut
    Et tu t'y connais là dedans ?

  8. #8
    Membre éclairé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Mars 2006
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mars 2006
    Messages : 58
    Par défaut
    Je suis pas un expert en thread mais ma logique voudrait que le chien puisse accéder au information de la caisse (savoir où celle ci se trouve). Tu pourrais faire ca en passant ta caisse à la classe chien.
    Sinon il y a une autre solution qui consiste à faire une classe singleton qui représente ton environnement (tous les objets sont y sont présents avec leurs coordonnées). Chaque objet (thread) pourrait ainsi connaitre la position des autres objets.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Je comprends la première méthode mais je pense qu'il faut prendre la deuxième car elle a l'air plus générale.

    Si je comprends bien, je dois faire une classe générale créant une caisse et un chien. Je garde mes classes comme elles sont et après je ne vois pas.

  10. #10
    Membre Expert
    Avatar de Gueritarish
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 800
    Par défaut
    Sinon, à part ça mon précédent message ne t'apporte rien (mauvaise manip )

    Bon, sinon, une méthode pour arriver à ce que tu veux faire serait de donner la position de la caisse au chien après que celle-ci ai avancé d'un mouvement. Je m'explique, il te faut un 3ème Thread qui soit en paramètre de tes 2 classes Caisse et Chien.
    Dans le run() de se Thread, chaque fois qu'il est "réveillé", il fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public void run() {
          //On attend que la caisse ai passé les infos...
          this.sleep(10);
          if (yCaisse == yChien) {
                if(Math.abs(xCaisse - xChien) < 5) //distance inférieure à 5 pixels par exemple
                      chien.notify();
          }
          //il se "rendort"
          this.wait();
    }
    Comme ça dans ta classe Chien, tu n'as plus qu'à faire dans le run :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public void run() {
          sauter();
          comm.setPositionChien(this.X, this.Y);
          wait();
    }
    Et dans ta classe Caisse, tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public void run() {
          changerDistance();
          comm.notify();
          comm.setPositionCaisse(this.X, this.Y);
    }

  11. #11
    Membre Expert
    Avatar de Gueritarish
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 800
    Par défaut
    Voilà, si quelque chose te chiffonne, n'hésite pas...

    C'est un truc vite fait qui nécessite peut-être des améliorations et que je n'ai pas du tout testé... Donc

  12. #12
    Membre éclairé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Mars 2006
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mars 2006
    Messages : 58
    Par défaut
    Si tu veux partir dans le seconde solution, il faut gérer un sorte de tableau (ou autre) qui contient les objets avec leur position dans l'espace. Ainsi, au moment où le chien (où la caisse se réveille), tu peux aller dans ce tableau voir si il y a quelqu'un dans les environs.

    Mais vue que tu travailles avec des threads, vient le soucis dans la concurrence... Que faire si 2 objets décident de se déplacer en même temps à la même position ? Je t'avouerai que je n'y ai pas encore pensé

  13. #13
    Membre Expert
    Avatar de Gueritarish
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 800
    Par défaut
    Bah si tu veux partir dans cette deuxième solution, il va te falloir implémenter des sémaphores ou des moniteurs (peut-être que ça existe en Java) ...
    Après, c'est toi qui vois, la difficulté n'est pas la même suivant ton niveau de programmation et de compréhension des accés concurents

  14. #14
    Membre éclairé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Mars 2006
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mars 2006
    Messages : 58
    Par défaut
    Je suis d'accord avec Gueritarish. La seconde solution demande une plus grande reflexion et analyse.
    Alors si tu dois juste faire une petite maquette où 2 threads doivent communiquer ensemble, la première solution est vraiment plus simple à mettre en place.
    Si au contraire, ton application doit au final pouvoir gérer un nombre non connu d'objet dans un espace, la seconde solution est réellement la plus propre.

  15. #15
    Invité
    Invité(e)
    Par défaut
    Je vais tester la méthode avec le 3eme thread.

    Je ne pense pas qu'il soit utile de faire compliqué.

    Le 3eme thread doit etre créé dans ma classe main ?

    Merci.

  16. #16
    Membre Expert
    Avatar de Gueritarish
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 800
    Par défaut
    Oui, il faut que tu lui passes en paramètres les coordonnées de ta Caisse et du Chien. Ensuite, il faut que tu modifies les constructeurs de Caisse et de Chien pour qu'il puisse prendre en paramètres ce nouveau Thread

  17. #17
    Invité
    Invité(e)
    Par défaut
    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
    public class Test extends Thread
    {
    public Test()
    {
    }
    public void run() 
    {
    this.sleep(10);
    if (yCaisse == yChien) 
    {
    if(Math.abs(xCaisse - xChien) < 5) //distance inférieure à 5 pixels par exemple
    chien.notify();
    }
    //il se "rendort"
    this.wait();
    }
    }
    Ensuite, dans le programme général :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public class prog
    {
    public static void main (String args[])
    {
    Test comm = new comm();
    Caisse Macaisse= new Caisse (a,b,comm);
    Chien MonChien= new Caisse (a,b,comm);
    }
    }
    Est-ce comme çà ?

    Merci

  18. #18
    Membre Expert
    Avatar de Gueritarish
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 800
    Par défaut
    Oui, mais dans ta classe Test, il te faut rajouter des attributs pour les positions de la Caisse et du Chien...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public class Test extends Thread{
          private int xCaisse;
          private int yCaisse;
          //idem pour le Chien
          ...
    }
    Et donc dans ta classe principale, tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class prog{
          public static void main (String args[])
          {
                //a1, a2 = position Caisse
                //b1, b2 = position Chien
                Test comm = new comm(a1, a2, b1, b2);
                Caisse Macaisse= new Caisse (a1,a2,comm);
                Chien MonChien= new Caisse (b1,b2,comm);
          }
    }
    Enfin, avec tout ce que cela comporte

  19. #19
    Invité
    Invité(e)
    Par défaut
    Ok.

    Merci

Discussions similaires

  1. débutante avec les threads
    Par dc.sara dans le forum Réseau
    Réponses: 2
    Dernier message: 10/12/2007, 11h08
  2. [log4j][débutant] Bonnes pratiques avec les threads ?
    Par scougirou dans le forum Logging
    Réponses: 1
    Dernier message: 13/07/2007, 16h27
  3. Probleme avec les threads
    Par Orahn dans le forum MFC
    Réponses: 5
    Dernier message: 04/11/2005, 10h14
  4. Réponses: 5
    Dernier message: 10/05/2005, 10h22
  5. [langage] Perl a t'il été compiler avec les threads
    Par vodevil dans le forum Langage
    Réponses: 2
    Dernier message: 07/05/2005, 15h00

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