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

Langage Java Discussion :

Problème gestion de compteur


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 307
    Par défaut Problème gestion de compteur
    Bonjour,
    Je suis actuellement en train de développer une petite application mettant en pratique l'utilisation du Semaphore.
    Il s'agit d'un salon de coiffure qui peut accueillir 5 personnes. Deux d'entres elles sont coiffées par les 2 coiffeurs et les 3 autres sont dans la salle d'attente. Dès qu'un coiffeur termine une personne, une autre qui attendait son tour en salle d'attente peut prendre place et libère donc une place dans celle-ci.
    J'ai un problème de gestion des compteurs avec mes coiffeurs. Pour l'instant un client est coiffé par les 2 coiffeurs chacun leurs tours. Comment résoudre ce soucis ?
    Voici mon code :

    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    package sal;
    import java.util.concurrent.*;
     
    class Coiffeur extends Thread {
        String nom;
        Semaphore fauteuil,salle;
     
        public Coiffeur(String str, Semaphore f, Semaphore s){
            nom = str;
            fauteuil = f;
            salle = s;
        }
     
        public synchronized void meCoiffe()
        {
            notify();
            try{
                wait();
            }
            catch(InterruptedException e){
            }
        }
     
        public synchronized void run() {
            int i = 1;
     
            while (true) {// boucle infinie
                try {
                    wait();
                } catch (InterruptedException e) {
                }
                System.out.println(nom+" travaille ("+i+"ème client)");
                try {
    				this.sleep(1000);
    			} catch (InterruptedException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
                notify(); // donne congé au client
                i++;
            }
        }
    }
     
    class Client extends Thread {
        int identifiant;
        Semaphore fauteuil, salle;
        Coiffeur coiffeur;
     
        public Client(int id, Coiffeur c, Semaphore f, Semaphore s) {
            identifiant = id;
            coiffeur = c;
            fauteuil = f;
            salle = s;
        }
     
        void dit(String s)
        {
            System.out.println("Client "+identifiant+" "+s);
        }
     
        public void run() {
     
            dit(" entre dans le salon.");
            try {
    			this.sleep(1000);
    		} catch (InterruptedException e1) {
    			// TODO Auto-generated catch block
    			e1.printStackTrace();
    		}
     
            if(!salle.tryAcquire()){
                dit("repart faché !!!");
            }else{
                dit("s'asseoit et attend.");
     
                try{fauteuil.acquire();
                }catch(InterruptedException e){
                }
                coiffeur.meCoiffe(); // Réveille le coiffeur
                fauteuil.release();
                salle.release();
     
                dit("repart content.");
                try {
    				this.sleep(1000);
    			} catch (InterruptedException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
            }
        }
    }
     
    public class SalonCoiffure {
        public static void main (String[] args) {
            int i=1; //compteur coiffeurs
            int taille = 3; // de la salle d'attente
            Semaphore fauteuil = new Semaphore(2,true); // mutex pour le fauteuil
                                                        // avec accès FIFO
            Semaphore salle = new Semaphore(taille); // salle d'attente 
            Coiffeur coiffeur1= new Coiffeur("Coiffeur 1", fauteuil, salle);
            Coiffeur coiffeur2 = new Coiffeur("Coiffeur 2", fauteuil, salle);
            System.out.println("Ouverture du Salon");
            coiffeur1.start();
            coiffeur2.start();
     
            while(true){//boucle infinie
                new Client(i,coiffeur1,fauteuil,salle).start();
                i++;
                new Client(i,coiffeur2,fauteuil,salle).start();
                i++;
                try {
    				Thread.sleep(1000);
    			} catch (InterruptedException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
            }
        } 
    }
    Merci d'avance pour votre aide

  2. #2
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    Je viens de tester et ca a l'air de marcher. Quand tu dis
    Pour l'instant un client est coiffé par les 2 coiffeurs chacun leurs tours
    tu es sur que ce n'est pas parce que tu affiches i (le n-ieme client) dans la trace des coiffeurs plutot que le numero du client ?

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 307
    Par défaut
    Si c'est possible mais bon il faut quand même incrémenter les numéros de client au niveau de la classe SalonCoiffure et c'est plus à ce niveau qu'il faudrait que j'effectue des modifications ?
    Merci pour ton aide

  4. #4
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    Ton probleme est que le coiffeur ne sait pas quel client il a. Pour ne pas trop changer ton code, tu pourrais faire un truc comme ca :
    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
    50
    51
    52
    53
    54
    55
    56
    class Coiffeur extends Thread
    {
       String nom;
     
       Semaphore fauteuil, salle;
     
       int client_courant = -1;
     
       public Coiffeur(String str, Semaphore f, Semaphore s)
       {
          nom = str;
          fauteuil = f;
          salle = s;
       }
     
       public synchronized void meCoiffe(int client)
       {
          notify();
          try
          {
             client_courant = client;
             wait();
          }
          catch (InterruptedException e)
          {
          }
       }
     
       public synchronized void run()
       {
          int i = 1;
     
          while (true)
          {// boucle infinie
             try
             {
                wait();
             }
             catch (InterruptedException e)
             {
             }
             System.out.println(nom + " travaille sur le client " + client_courant);
             try
             {
                this.sleep(1000);
             }
             catch (InterruptedException e)
             {
                // TODO Auto-generated catch block
                e.printStackTrace();
             }
             notify(); // donne congé au client
             i++;
          }
       }
    }
    En plus, tu dis que le salon doit accueillir 5 personnes (3 en salle d'attente et 2 en cours de coiffure).
    Mais quand dans ton main, tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
             coiffeur.meCoiffe(this.identifiant); // Réveille le coiffeur
             fauteuil.release();
             salle.release();
    Autement dit, tu liberes la salle APRES que le coiffeur ait coiffé alors qu'il faudrait plutot liberer la salle au moment ou le coiffeur commence à coiffer. Il y a donc 2 solutions : considerer que les clients en cours de coiffure sont dans la salle d'attente, ce qui revient à initialiser le semaphore salle à 5. Ou bien, comme tu l'as fait, considerer que les clients quittent la salle lorsqu'ils se font coiffer et liberer la salle apres :
    Ce qui reviendrait à faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
             salle.release();
             coiffeur.meCoiffe(this.identifiant); // Réveille le coiffeur
             fauteuil.release();
    a+

  5. #5
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 307
    Par défaut
    Merci pour ton aide et tes explications.
    Cependant je viens de tester ton code et maintenant il y a 2 clients 1, 2 clients 2 etc ... et donc le client 1 par exemple passe toujours avec les 2 coiffeurs (cependant il est possible que ce soit un client différent vu qu'il y a 2 clients 1 par exemple)
    Voilà un peu de code d'exécution :
    Ouverture du Salon
    Client 1 entre dans le salon.
    Client 1 entre dans le salon.
    Client 1 s'asseoit et attend.
    Coiffeur 2 travaille sur le client 1
    Client 2 entre dans le salon.
    Client 1 s'asseoit et attend.
    Coiffeur 1 travaille sur le client 1
    Client 2 entre dans le salon.
    Client 2 s'asseoit et attend.
    Client 1 repart content.
    Coiffeur 1 travaille sur le client 2
    Client 2 s'asseoit et attend.
    Client 1 repart content.
    Coiffeur 2 travaille sur le client 2
    Client 3 entre dans le salon.
    Client 3 entre dans le salon.
    Client 3 s'asseoit et attend.
    Client 4 entre dans le salon.
    Client 3 s'asseoit et attend.
    Client 2 repart content.
    Client 2 repart content.
    Coiffeur 2 travaille sur le client 3
    Coiffeur 1 travaille sur le client 3
    Client 4 entre dans le salon.
    Client 4 s'asseoit et attend.
    Client 3 repart content.
    Coiffeur 2 travaille sur le client 4
    Client 3 repart content.
    Client 4 s'asseoit et attend.

  6. #6
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    Voila les traces que j'obtiens :
    Ouverture du Salon
    Client 1 entre dans le salon.
    Client 2 entre dans le salon.
    Client 1 s'asseoit et attend.
    Client 2 s'asseoit et attend.
    Coiffeur 1 travaille sur le client 1
    Coiffeur 2 travaille sur le client 2
    Client 3 entre dans le salon.
    Client 4 entre dans le salon.
    Client 3 s'asseoit et attend.
    Client 4 s'asseoit et attend.
    Client 5 entre dans le salon.
    Client 6 entre dans le salon.
    Client 1 repart content.
    Client 2 repart content.
    Coiffeur 1 travaille sur le client 3
    Client 6 s'asseoit et attend.
    Client 5 s'asseoit et attend.
    Client 7 entre dans le salon.
    Coiffeur 2 travaille sur le client 4
    Client 8 entre dans le salon.
    Client 7 s'asseoit et attend.
    Client 9 entre dans le salon.
    Client 8 repart faché !!!
    Client 10 entre dans le salon.
    Au passage, le programme complet :
    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    import java.util.concurrent.*;
     
    class Coiffeur extends Thread
    {
       String nom;
     
       Semaphore fauteuil, salle;
     
       int client_courant = -1;
     
       public Coiffeur(String str, Semaphore f, Semaphore s)
       {
          nom = str;
          fauteuil = f;
          salle = s;
       }
     
       public synchronized void meCoiffe(int client)
       {
          notify();
          try
          {
             client_courant = client;
             wait();
          }
          catch (InterruptedException e)
          {
          }
       }
     
       public synchronized void run()
       {
          int i = 1;
     
          while (true)
          {// boucle infinie
             try
             {
                wait();
             }
             catch (InterruptedException e)
             {
             }
             System.out.println(nom + " travaille sur le client " + client_courant);
             try
             {
                this.sleep(1000);
             }
             catch (InterruptedException e)
             {
                // TODO Auto-generated catch block
                e.printStackTrace();
             }
             notify(); // donne congé au client
             i++;
          }
       }
    }
     
    class Client extends Thread
    {
       int identifiant;
     
       Semaphore fauteuil, salle;
     
       Coiffeur  coiffeur;
     
       public Client(int id, Coiffeur c, Semaphore f, Semaphore s)
       {
          identifiant = id;
          coiffeur = c;
          fauteuil = f;
          salle = s;
       }
     
       void dit(String s)
       {
          System.out.println("Client " + identifiant + " " + s);
       }
     
       public void run()
       {
     
          dit(" entre dans le salon.");
          try
          {
             this.sleep(1000);
          }
          catch (InterruptedException e1)
          {
             // TODO Auto-generated catch block
             e1.printStackTrace();
          }
     
          if (!salle.tryAcquire())
          {
             dit("repart faché !!!");
          }
          else
          {
             dit("s'asseoit et attend.");
     
             try
             {
                fauteuil.acquire();
             }
             catch (InterruptedException e)
             {
             }
             salle.release();
             coiffeur.meCoiffe(this.identifiant); // Réveille le coiffeur
             fauteuil.release();
     
             dit("repart content.");
             try
             {
                this.sleep(1000);
             }
             catch (InterruptedException e)
             {
                // TODO Auto-generated catch block
                e.printStackTrace();
             }
          }
       }
     
       public static class SalonCoiffure
       {
          public static void main(String[] args)
          {
             int i = 1; // compteur coiffeurs
             int taille = 3; // de la salle d'attente
             Semaphore fauteuil = new Semaphore(2, true); // mutex pour le fauteuil
             // avec accès FIFO
             Semaphore salle = new Semaphore(taille); // salle d'attente
             Coiffeur coiffeur1 = new Coiffeur("Coiffeur 1", fauteuil, salle);
             Coiffeur coiffeur2 = new Coiffeur("Coiffeur 2", fauteuil, salle);
             System.out.println("Ouverture du Salon");
             coiffeur1.start();
             coiffeur2.start();
     
             while (true)
             {// boucle infinie
                new Client(i, coiffeur1, fauteuil, salle).start();
                i++;
                new Client(i, coiffeur2, fauteuil, salle).start();
                i++;
                try
                {
                   Thread.sleep(1000);
                }
                catch (InterruptedException e)
                {
                   // TODO Auto-generated catch block
                   e.printStackTrace();
                }
             }
          }
       }
    }
    a+

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

Discussions similaires

  1. Problème gestion de collisions
    Par kaien dans le forum Physique
    Réponses: 6
    Dernier message: 31/01/2007, 16h31
  2. Problème gestion IOException
    Par matt8-5 dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 03/11/2006, 16h07
  3. [C# 2.0] Problème gestion mémoire
    Par Stéphane-M dans le forum Windows Forms
    Réponses: 13
    Dernier message: 21/09/2006, 15h36
  4. Problème gestion actionListener pour JButton
    Par cedricbr dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 26/05/2006, 17h39
  5. Problème - Gestion des exceptions - MFC.
    Par Atomikx dans le forum MFC
    Réponses: 4
    Dernier message: 14/11/2005, 10h38

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