JAVA Problème sémaphore

Résolu/Fermé
boobs60 - 22 oct. 2009 à 23:30
 boobs60 - 23 oct. 2009 à 12:45
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;

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:

5 réponses

sandul Messages postés 3924 Date d'inscription jeudi 22 mai 2008 Statut Membre Dernière intervention 8 octobre 2010 722
23 oct. 2009 à 10:56
[Edit] Oups, nan; pas vraiment, pas comme tu as écrit le reste du programme. Il faut plutôt remplacer

	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().

++
1
nabil07 Messages postés 140 Date d'inscription vendredi 14 septembre 2007 Statut Membre Dernière intervention 10 avril 2014 64
23 oct. 2009 à 01:04
tu peux synchroniser la méthode EntrerMagasin(), avec le mot clé synchronized.
0
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.
0
sandul Messages postés 3924 Date d'inscription jeudi 22 mai 2008 Statut Membre Dernière intervention 8 octobre 2010 722
23 oct. 2009 à 10:47
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.

++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Merci beaucoup pour votre aide.
Je peux enfin avancer sur mon projet.
0