84 lines
2.7 KiB
Java
84 lines
2.7 KiB
Java
|
|
||
|
import java.util.concurrent.Semaphore;
|
||
|
|
||
|
public class PhiloSem3 implements StrategiePhilo {
|
||
|
|
||
|
/****************************************************************/
|
||
|
|
||
|
Semaphore mutex = new Semaphore(1);
|
||
|
EtatPhilosophe[] etats;
|
||
|
Semaphore[] bloqueur;
|
||
|
|
||
|
boolean peutManger(int no) {
|
||
|
int pg = Main.PhiloGauche(no);
|
||
|
int pd = Main.PhiloDroite(no);
|
||
|
|
||
|
return etats[pg] != EtatPhilosophe.Mange && etats[pd] != EtatPhilosophe.Mange;
|
||
|
}
|
||
|
|
||
|
public PhiloSem3(int nbPhilosophes) throws InterruptedException {
|
||
|
this.bloqueur = new Semaphore[Main.nbPhilosophes];
|
||
|
this.etats = new EtatPhilosophe[Main.nbPhilosophes];
|
||
|
for (int i = 0; i < bloqueur.length; i++) {
|
||
|
bloqueur[i] = new Semaphore(0, true);
|
||
|
etats[i] = EtatPhilosophe.Pense;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Le philosophe no demande les fourchettes. Précondition : il n'en possède
|
||
|
* aucune. Postcondition : quand cette méthode retourne, il possède les deux
|
||
|
* fourchettes adjacentes à son assiette.
|
||
|
*/
|
||
|
public void demanderFourchettes(int no) throws InterruptedException {
|
||
|
mutex.acquire();
|
||
|
if (peutManger(no)) {
|
||
|
etats[no] = EtatPhilosophe.Mange;
|
||
|
mutex.release();
|
||
|
} else {
|
||
|
etats[no] = EtatPhilosophe.Demande;
|
||
|
mutex.release();
|
||
|
bloqueur[no].acquire();
|
||
|
}
|
||
|
|
||
|
int fg = Main.FourchetteGauche(no);
|
||
|
int fd = Main.FourchetteDroite(no);
|
||
|
IHMPhilo.poser(fg, EtatFourchette.AssietteDroite);
|
||
|
IHMPhilo.poser(fd, EtatFourchette.AssietteGauche);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Le philosophe no rend les fourchettes. Précondition : il possède les deux
|
||
|
* fourchettes adjacentes à son assiette. Postcondition : il n'en possède
|
||
|
* aucune. Les fourchettes peuvent être libres ou réattribuées à un autre
|
||
|
* philosophe.
|
||
|
*/
|
||
|
public void libererFourchettes(int no) throws InterruptedException {
|
||
|
int pg = Main.PhiloGauche(no);
|
||
|
int pd = Main.PhiloDroite(no);
|
||
|
|
||
|
mutex.acquire();
|
||
|
etats[no] = EtatPhilosophe.Pense;
|
||
|
if (peutManger(pg) && etats[pg] == EtatPhilosophe.Demande) {
|
||
|
etats[pg] = EtatPhilosophe.Mange;
|
||
|
bloqueur[pg].release();
|
||
|
}
|
||
|
if (peutManger(pd) && etats[pd] == EtatPhilosophe.Demande) {
|
||
|
etats[pd] = EtatPhilosophe.Mange;
|
||
|
bloqueur[pd].release();
|
||
|
}
|
||
|
mutex.release();
|
||
|
|
||
|
int fg = Main.FourchetteGauche(no);
|
||
|
int fd = Main.FourchetteDroite(no);
|
||
|
IHMPhilo.poser(fg, EtatFourchette.Table);
|
||
|
IHMPhilo.poser(fd, EtatFourchette.Table);
|
||
|
}
|
||
|
|
||
|
/** Nom de cette stratégie (pour la fenêtre d'affichage). */
|
||
|
public String nom() {
|
||
|
return "Sémaphores, strat 3: scrute voisin";
|
||
|
}
|
||
|
|
||
|
}
|