67 lines
2 KiB
Java
67 lines
2 KiB
Java
|
|
import java.util.concurrent.Semaphore;
|
|
|
|
public class PhiloSem implements StrategiePhilo {
|
|
|
|
/****************************************************************/
|
|
|
|
int nbPhilosophe;
|
|
int fg, fd;
|
|
|
|
Semaphore[] fourchettes;
|
|
|
|
public PhiloSem(int nbPhilosophes) {
|
|
this.nbPhilosophe = nbPhilosophes;
|
|
this.fourchettes = new Semaphore[Main.nbPhilosophes];
|
|
for (int i = 0; i < fourchettes.length; i++) {
|
|
fourchettes[i] = new Semaphore(1, true);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 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 {
|
|
|
|
int fg = Main.FourchetteGauche(no);
|
|
int fd = Main.FourchetteDroite(no);
|
|
|
|
while (true) {
|
|
fourchettes[fd].acquire();
|
|
IHMPhilo.poser(fd, EtatFourchette.AssietteGauche);
|
|
if (fourchettes[fg].tryAcquire()) {
|
|
IHMPhilo.poser(fg, EtatFourchette.AssietteDroite);
|
|
break;
|
|
} else {
|
|
fourchettes[fd].release();
|
|
IHMPhilo.poser(fd, EtatFourchette.Table);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 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) {
|
|
int fd = Main.FourchetteDroite(no);
|
|
fourchettes[fd].release();
|
|
IHMPhilo.poser(fd, EtatFourchette.Table);
|
|
|
|
int fg = Main.FourchetteGauche(no);
|
|
fourchettes[fg].release();
|
|
IHMPhilo.poser(fg, EtatFourchette.Table);
|
|
|
|
}
|
|
|
|
/** Nom de cette stratégie (pour la fenêtre d'affichage). */
|
|
public String nom() {
|
|
return "Sémaphores, strat 1: fourchettes ressources critiques";
|
|
}
|
|
|
|
}
|