JAVA Problème sémaphore
Résolu
boobs60
-
boobs60 -
boobs60 -
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 sorte. Mon problème est que le magasin n'est accessible que par un client à la fois. Donc je doit utiliser les sémaphores. Donc les clients 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):
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 :
import java.util.Random;
import java.util.concurrent.Semaphore;
MERCI d'avance à tout ceux qui pourront m'aider.
Amicalement Boobs60.
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 sorte. Mon problème est que le magasin n'est accessible que par un client à la fois. Donc je doit utiliser les sémaphores. Donc les clients 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):
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 :
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 à tout ceux qui pourront m'aider.
Amicalement Boobs60.
A voir également:
- JAVA Problème sémaphore
- Jeux java itel - Télécharger - Jeux vidéo
- Waptrick java football - Télécharger - Jeux vidéo
- Eclipse java - Télécharger - Langages
- Java apk - Télécharger - Langages
- Waptrick java voiture - Télécharger - Jeux vidéo
5 réponses
[Edit] Oups, nan; pas vraiment, pas comme tu as écrit le reste du programme. Il faut plutôt remplacer
par un truc du genre
Avec cette écriture, pas besoin de sémaphores ni de synchroniser la méthode EntrerMagasin().
++
public void run() { //this.PrendreCaddie(); this.EntrerMagasin(); this.ChoisirArticle(); this.AllerCaisse(); this.Payer(); this.Sortir(); }
par un truc du genre
public void run() { synchronized (this) { // this.PrendreCaddie(); this.EntrerMagasin(); this.ChoisirArticle(); this.AllerCaisse(); this.Payer(); this.Sortir(); } }
Avec cette écriture, pas besoin de sémaphores ni de synchroniser la méthode EntrerMagasin().
++
Merci de ton aide nabil07 mais cela ne règle pas mon problème. en Mettant synchronized faut il que j'enleve ma sémaphore ??
Merci.
Amicalement Boobs60.
Merci.
Amicalement Boobs60.
Hello,
en Mettant synchronized faut il que j'enleve ma sémaphore ??
Je plussoie nabil. Oui, il suffit de synchroniser EnterMagasin(). Plus besoin de sémaphores.
++
en Mettant synchronized faut il que j'enleve ma sémaphore ??
Je plussoie nabil. Oui, il suffit de synchroniser EnterMagasin(). Plus besoin de sémaphores.
++
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question