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:
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