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 :
Merci d'avance pour votre aide
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(); } } } }







Répondre avec citation


Partager