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