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 :

Péage avec des Threads


Sujet :

Concurrence et multi-thread Java

  1. #1
    Invité
    Invité(e)
    Par défaut Péage avec des Threads
    Bonsoir,

    Il y a quelques jours, j'avais posé une questions sur la communication entre thread. Un membre m'a expliqué et je l'en remercie.

    J'ai un nouveau problème.

    Je dois réaliser la comunication entre une classe voiture et une classe barrière.

    Chaque objet dispose d'un thread et doit communiquer des informations à l'autre objet.

    Je ne sais pas trop comment réaliser ce système.

    Le formateur a dit qu'il faut que la voiture s'arrête si la barrière est fermée puis signale sa présence à la barrière. Elle va s'ouvrir et dire à la voiture qu'elle peut passer. La voiture se remet en route.

    L'exercice est plus étrange et compliqué que celui exposé dans le post précédent.

    Quelqu'un peut-il m'aider ?

    Je vous remercie.

    AdoOs

  2. #2
    Invité
    Invité(e)
    Par défaut
    J'ai créé deux 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
     
     
    public class voiture extends Thread
    {
    int x=0; // Position de la voiture
     
    public void avancer ()
    {
    this.x=this.x+1;
    }
     
    public void run() 
    {
    avancer();        
    }
     
    }

    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
     
     
    public class barriere extends Thread
    {
    int x=100; // Position X de la barriere
    int y=100; // Position Y de la barriere
     
    public void ouvrir ()
    {
    this.y=this.y+1;
    }
     
    public void run() 
    {
    ouvrir();
    }
     
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    public class prog
    {
    public static void main (String [] args)
    {
    voiture v = new voiture();
    barriere b = new barriere();
     
    Thread t1 = new Thread(v);
    Thread t2 = new Thread(b);
    }
     
    }
    Les méthodes run et la classe prog ne sont pas complètes car je ne sais pas comment faire.

    Il faut que quand la voiture est devant la barrière, la voiture s'arrête et dise à la barrière : je suis là.

    La barrière va alors lancer son run() et va s'ouvrir. Ensuite, elle dit à la voiture, tu peux passer. La voiture appelle donc run() et avance.

    Quelqu'un peut-il m'aider ?

    AdoOs

  3. #3
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Points : 4 314
    Points
    4 314
    Par défaut
    Dans ton problème, je ne vois pas vraiment en quoi tu as besoin de threads... Est-ce imposé par l'exercice? Parceque sinon, tu peux tout simplement avoir des objets de classe Voiture et Barriere qui répondront à ton problème...
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  4. #4
    Invité
    Invité(e)
    Par défaut
    Le mec qui fait la formation a imposé l'utilisaton de thread dans chaque objet.

    On étudie les threads donc c'est pour çà que c'est imposé.

  5. #5
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Points : 4 314
    Points
    4 314
    Par défaut
    Dans ce cas je pense que tu as un problème de conception.

    Un thread est normalement fait pour touner en permanence, et effectuer des traitements en parallèle.

    La, utiliser la méthode run() d'un thread pour effectuer l'action "ouvrir" de ta barrière, ça n'a pas de sens! Pour faire ça, autant utiliser une classe non threadée.

    A mon avis, le but de ton exercice est pour le thread barrière est de tourner en continu et d'avoir une surveillance périodique de la présence d'une voiture. Dès qu'on en détecte une, on ouvre la barrière, et on la referme dès qu'aucune présence n'est plus détectée.

    Schématiquement voilà ce que tu dois obtenir pour ce thread je pense:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    private boolean voitureDetectee = false;
     
    // méthode de mise à jour de ce flag
     
    public void run() {
       while(true) {
          Thread.sleep(1000); // détection périodique toutes les secondes
          if(voitureDetectee) { ouvrir(); }
          else { fermer(); }
       } 
    }
    Evidemment, c'est simpliste, et le code n'est pas complet... mon but n'est pas de faire l'exercice à ta place Mais part plutôt sur une piste de ce genre... c'est dans ce sens que veut vous pousser celui qui fait la formation je pense
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  6. #6
    Invité
    Invité(e)
    Par défaut
    Je comprends ce que tu viens d'expliquer.

    L'autre problème est le suivant :

    Je lance l'application, la voiture avance en utilisant un thread. Je ne vois pas comment dire à la voiture "stop", la barrière est fermée et dire à la barrière "voitureDetectee".

    En effet, les threads tourne en même temps et pour le moment on n'a vu comment afficher du texte en même temps et un exo avec une caisse mais on ne l'a pas encore corrigé.

    Je suis débutant. Peux-tu m'aider à comprendre le fonctionnement s'il te plait ?

  7. #7
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Points : 4 314
    Points
    4 314
    Par défaut
    Ce n'est pas très dur... il suffit que ta voiture connaisse la barrière sur laquelle elle va avancer.

    Avant d'avancer, elle appelle barriere.isOuverte(); => si oui, elle passe, sinon, elle s'arrete et appelle barriere.setVoitureDetectee(true);

    Le thread vérifie toutes les X secondes si la barrière est ouverte. Dès qu'elle l'est elle la traverse (en n'oubliant pas de signaler à la barriere qu'elle n'est plus là)

    Exemple pour comprendre: ne t'en inspire pas pour coder... cet exemple est extrèmement mal codé => c'est juste pour saisir le principe. Voici le thread côté voiture associé à celui de la barrière que je t'ai donné ci-dessus.

    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
     
    private Barriere barriere;
    private int distanceAvant barriere = 10000;
     
    public void run() {
     
       while(true) {
     
          Thread.sleep(500);
     
          if(distanceAvantBarriere > 0) {
             distanceAvantBarriere--;  // tant qu'on n'est pas a la barriere
          } else {
             if(barriere.isOuverte()) {
                passerBarriere(); // passage de barriere
                barriere.setVoitureDetectee(false); // fermeture de la barriere
             } else {
                barriere.setVoitureDetectee(true); // signalement de présence au detecteur
             }
          }
       }
    }
    passerBarriere() peut par exemple réinitialiser distanceAvantBarriere avec une valeur aléatoire.

    Quelques System.out.println() sur le code de ta voiture devraient te permettre de visualiser dans la console le comportement des deux threads et de mieux comprendre leur fonctionnement:

    Tu noteras qu'à aucun moment la voiture n'ouvre la barriere: elle se contente de signaler sa présence. C'est le thread de la barriere qui tourne en parallele qui ouvrira/fermera la barriere périodiquement en fonction de la valeur de la variable de détection
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  8. #8
    Invité
    Invité(e)
    Par défaut
    Merci pour ton aide.

    Donc je crée mon objet Barriere et après je le passe en paramètre du constructeur de ma voiture.

  9. #9
    Membre chevronné Avatar de guigui5931
    Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2006
    Messages
    1 667
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 667
    Points : 2 232
    Points
    2 232
    Par défaut
    oui c'est ça
    autant l'hiver éclate que l'hétéroclite
    le vrai geek c'est celui qui croit qu'il y a 1024 mètres dans un kilomètre

  10. #10
    Invité
    Invité(e)
    Par défaut
    Grace aux explications, j'ai presque terminé.

    Il ne me reste plus qu'à trouver comment arrêter proprement les threads une fois la voiture passée.

    Je pense qu'une fois la voiture passée les threads doivent se terminer afin de pouvoir, si on le veut, relancer la procédure : Création de la voiture, création des threads, ...

    Est-il possible de faire arrêter tout les threads qaund la voiture est passée ?

  11. #11
    Membre chevronné Avatar de guigui5931
    Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2006
    Messages
    1 667
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 667
    Points : 2 232
    Points
    2 232
    Par défaut
    Je ne pense pas que les threads doivent s'arreter. En tout cas pas la barrière il faut qu'elle atende une autre voiture pour pouvoir la laisser passer.
    autant l'hiver éclate que l'hétéroclite
    le vrai geek c'est celui qui croit qu'il y a 1024 mètres dans un kilomètre

  12. #12
    Invité
    Invité(e)
    Par défaut
    Ok pour la barrière. Le thread s'arrêtera quand on quittera l'application.

    Par contre pour la voiture, une fois quelle est passée, je ne sais pas ce que je dois faire.

    Si sur le clic d'un bouton, je crée une nouvelle voiture alors l'autre sera encore là et elle aura un thread tournant dans le vide.

  13. #13
    Membre averti Avatar de Rayndell
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    289
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 289
    Points : 323
    Points
    323
    Par défaut
    Pour arrêter proprement un Thread, il est déconseillé d'utiliser les méthodes destructices telles stop() ou destroy(). Le mieux est d'implémentern dans ta classe Voiture, un attribut booléen estPassee, initialisée à false et qui passe à true dès que la barrière est passée. Il ne restera alors plus qu'à faire un petit test avant d'avancer la voiture :

    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
     
    private Barriere barriere;
    private int distanceAvantBarriere = 10000;
    private boolean estPassee = false;
     
    public void run() {
     
       while(!estPassee) {
     
          Thread.sleep(500);
     
          if(distanceAvantBarriere > 0) {
             distanceAvantBarriere--;  // tant qu'on n'est pas a la barriere
          } else {
             if(barriere.isOuverte()) {
                passerBarriere(); // passage de barriere
                barriere.setVoitureDetectee(false); // fermeture de la barriere
                estPassee = true;
             } else {
                barriere.setVoitureDetectee(true); // signalement de présence au detecteur
             }
          }
       }
    }
    "Et tu comprendras pourquoi mon nom est l'Eternel, quand sur toi s'abattra la colère du Tout-puissant."

  14. #14
    Membre émérite
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Points : 2 677
    Points
    2 677
    Par défaut
    Pour arrêter proprement un Thread, il est déconseillé d'utiliser les méthodes destructices telles stop() ou destroy().
    Alors comment faire pour "stopper" un thread qui ne sert plus a rien (ou dont on a plus besoin) ?
    Vous postez du code ? Merci d'utiliser les balises
    Un message vous paraît pertinent ? Merci de le gratifier d'un vote positif
    Vous avez obtenu une réponse à votre question ? Merci d'utiliser le tag
    __________________
    Ingénieur R&D, diplômé en 2007 de l'ISIMA
    Docteur en informatique, diplômé en 2015 de l'EDSPI de Clermont-Ferrand

  15. #15
    Membre averti Avatar de Rayndell
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    289
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 289
    Points : 323
    Points
    323
    Par défaut
    Je viens de l'expliquer plus haut ! Avec un booléen !!!

    Si tu regardes bien le code que j'ai posté, tu verras que la méthode run se termine lorsque la voiture est passée. Ensuite, le Thread étant inutile, le garbage collector fera le reste.
    "Et tu comprendras pourquoi mon nom est l'Eternel, quand sur toi s'abattra la colère du Tout-puissant."

  16. #16
    Membre émérite
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Points : 2 677
    Points
    2 677
    Par défaut
    Tu n'as pas compris ma question : je ne veux pas un thread qui s'arrete de lui meme, je veux savoir comment l'arréter quand je le désire. Bien sûr sans avoir à implémenter de méthodes dans le thread.
    Vous postez du code ? Merci d'utiliser les balises
    Un message vous paraît pertinent ? Merci de le gratifier d'un vote positif
    Vous avez obtenu une réponse à votre question ? Merci d'utiliser le tag
    __________________
    Ingénieur R&D, diplômé en 2007 de l'ISIMA
    Docteur en informatique, diplômé en 2015 de l'EDSPI de Clermont-Ferrand

  17. #17
    Membre éclairé
    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
    Points : 675
    Points
    675
    Par défaut
    Tu ne peux pas.

    Il y bien la methode interrupt, mais elle ne s'applique que dans certains cas.

    L'ajout de methodes pour controler l'arret du thread (si necessaire) est obligatoire.

  18. #18
    Membre averti Avatar de Rayndell
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    289
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 289
    Points : 323
    Points
    323
    Par défaut
    Si tu veux l'arrêter quand tu le désires, tu peux faire ceci : implémente un attribut static et public dans une de tes classes (n'importe laquelle, on s'en fout, le but est qu'elle soit visible et puisse être retrouvée facikement). Tu l'initialises à true :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    class Machin {
        public static boolean EN_MARCHE = true;
    Lorsque tu veux arrêter ton thread, fais un Machin.EN_MARCHE = false. Bien sûr, modifie la ligne de mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    while(!estPassee){
    par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    while(Machin.EN_MARCHE){
    "Et tu comprendras pourquoi mon nom est l'Eternel, quand sur toi s'abattra la colère du Tout-puissant."

  19. #19
    Membre émérite
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Points : 2 677
    Points
    2 677
    Par défaut
    Merci pour vos réponses.

    Serait-il possible d'avoir des précisions et des conseils sur l'utilisation et le fonctionnement précis des fonction interrupt, stop et destroy svp ? (autres bien sûr que "à ne pas utiliser" )
    Vous postez du code ? Merci d'utiliser les balises
    Un message vous paraît pertinent ? Merci de le gratifier d'un vote positif
    Vous avez obtenu une réponse à votre question ? Merci d'utiliser le tag
    __________________
    Ingénieur R&D, diplômé en 2007 de l'ISIMA
    Docteur en informatique, diplômé en 2015 de l'EDSPI de Clermont-Ferrand

  20. #20
    Membre éclairé
    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
    Points : 675
    Points
    675
    Par défaut
    Qu'est ce qui ne te parait pas clair dans la FAQ ou dans la javadoc ?

Discussions similaires

  1. Centrer une page avec des DIV imbriqués
    Par emstar dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 25/04/2006, 18h42
  2. Centrer une page avec des frames
    Par Nicos77 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 10/11/2005, 14h07
  3. Centrer une page avec des frames
    Par Nicos77 dans le forum Langage
    Réponses: 11
    Dernier message: 09/11/2005, 16h52
  4. [Threads] Actions continues avec des threads
    Par MiJack dans le forum Concurrence et multi-thread
    Réponses: 6
    Dernier message: 10/10/2005, 17h32
  5. mettre en page avec des div
    Par mathieu_r dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 10/08/2005, 11h35

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