IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Collection et Stream Java Discussion :

JAVA problème sémaphore


Sujet :

Collection et Stream Java

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2007
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 84
    Par défaut JAVA problème sémaphore
    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 :
    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();
    	 }
    }
    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.

    Merci d'avance.
    Amicalement Boobs60.

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Tes instances de Thread possèdent chacune leur propre Semaphore.
    Ajoute le mot clé static dans la déclaration de ton Semaphore, et l'instance sera partagée par tous les Thread. Ton programme fonctionnera correctement.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2007
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 84
    Par défaut
    Infiniment merci dinobogan pour ton aide et la résoultion de mon problème. Voila déjà 2 jours que je cherche et c'est juste ce petit mot qui me faisait tourner en rond.

    Encore merci.
    Amicalement Boobs60

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [DOM][Java] Problème avec le retour de getNodeName()
    Par anutka dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 11/04/2012, 21h38
  2. Problème sémaphore POSIX en C++
    Par yakotey dans le forum C++
    Réponses: 5
    Dernier message: 15/12/2005, 15h41
  3. [Java] Problème ClassPath
    Par nsanabi dans le forum Jasper
    Réponses: 8
    Dernier message: 02/11/2005, 18h44
  4. [JAVA] Problème supression noeud d'un document XML
    Par vero59 dans le forum XML/XSL et SOAP
    Réponses: 10
    Dernier message: 16/08/2005, 16h12
  5. [Eclipse][Java]Problème de compilation sur CTRL+S
    Par ZeKiD dans le forum Eclipse Java
    Réponses: 5
    Dernier message: 27/05/2004, 11h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo