Bonjour tout le monde,
Voila je sollicite votre aide car j'ai un projet à rendre (Etude en licence 3 info) sur les threads et les sémaphores.
Grosso merdo voici la partie du sujet sur lequel je bloque. Des clients arrivent, prennent un caddie, rentre dans le magasin,
choisissent des articles, vont vers les caisses, paient puis sortent.
Mon problème est que le magasin n'est accessible que par un nombre déterminé de client à la fois (par exemple 5 au max).
Donc le client 2 ne peut pas rentrer dans le magasin tant que le client 1 n'est pas sorti.
Mais voici le résultat que j'obtiens (test avec 5 clients et une sémaphore qui n'autorise qu'un client):
Cli0 entre dans le magasin
Cli0 choisie ses articles.
Cli2 entre dans le magasin
Cli2 choisie ses articles.
Cli1 entre dans le magasin
Cli1 choisie ses articles.
Cli3 entre dans le magasin
Cli3 choisie ses articles.
Cli4 entre dans le magasin
Cli4 choisie ses articles.
Cli4 a mis 4s pour choisir ses articles.
Cli4 se dirige vers les caisses
Cli4 paie ses articles.
Cli2 a mis 6s pour choisir ses articles.
Cli2 se dirige vers les caisses
.....
On voit bien que les clients rentre les uns après les autres.
Voici le code que j'utilise :
Si quelqu'un pouvait m'apporter un peut d'aide car après de longues heures à poser des questions à mon ami google, je n'est toujours pas trouvé de réponse et ne comprend toujours pas vraiment le fonctionnement des sémaphores.
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 import java.util.Random; import java.util.concurrent.Semaphore; public class client extends Thread { Semaphore sema = new Semaphore(1,true); //ICI JE CRÉE MA SÉMAPHORE AVEC 1 EN PARAMÈTRE POUR LE MAX DE RESSOURCE public client (String Nom) { super(Nom); } public void run() { //this.PrendreCaddie(); this.EntrerMagasin(); this.ChoisirArticle(); this.AllerCaisse(); this.Payer(); this.Sortir(); } public void PrendreCaddie() { } public void EntrerMagasin() { try { sema.acquire(); //ICI JE DEMANDE QUE LA SÉMAPHORE DÉCRÉMENTE DE 1 POUR BLOQUER LES CLIENTS (enfin c'est ce que je pense ^^) } catch(InterruptedException ie){} System.out.println(this.getName() + " entre dans le magasin"); } public void ChoisirArticle() { System.out.println(this.getName() + " choisie ses articles."); Random R = new Random(); int TChoix = (1 + R.nextInt(5 - 0)) * 2000; try { sleep(TChoix); } catch(InterruptedException ie){} System.out.println(this.getName() + " a mis " + TChoix/1000 + "s pour choisir ses articles."); } public void AllerCaisse() { System.out.println(this.getName() + " se dirige vers les caisses"); } public void Payer() { System.out.println(this.getName() + " paie ses articles."); Random R = new Random(); int TPayer = (1 + R.nextInt(5 - 0)) * 2000; try { sleep(TPayer); } catch(InterruptedException ie){} System.out.println(this.getName() + " a mis " + TPayer/1000 + "s pour payer ses articles."); } public void Sortir() { sema.release(); //ICI JE DEMANDE QUE LA SÉMAPHORE INCRÉMENTE DE 1 POUR LIBÉRER un CLIENTS (enfin c'est ce que je pense aussi ^^) System.out.println(this.getName() + " sort du magasin"); interrupted(); } }
Merci d'avance.
Amicalement Boobs60.
Partager