Java ライブラリが提供するセマフォを使用して、この古典的なトイレの入り口の問題を実装したいと考えています。
シナリオは次のとおりです。最大 4 人の女性と 5 人の男性が同時に使用できない公衆トイレがあります。また、待っている女性が少なくとも 1 人いますが、女性が簡単に入場できるように、男性は待つ必要があります。
これまでのところ、この同時実行クラスをモデル化しました...
public class Concurrencia {
Semaphore mujeres; // Semaphore for women, initialized in 4
Semaphore hombres; // Semaphore for men, initialized in 5
public Concurrencia (Semaphore mujeres, Semaphore hombres) {
this.mujeres = mujeres;
this.hombres = hombres;
}
public synchronized void EntradaHombres () { // Method for men's entrance
if ( mujeres.availablePermits() == 4 && !mujeres.hasQueuedThreads() ) {
System.out.println("Entró un hombre al baño"); // Man gets in
try { hombres.acquire(); } catch (InterruptedException ex) { }
}
else {
System.out.println("Hombre en espera"); // Man should wait
}
}
public synchronized void EntradaMujeres () { // Method for women's entrance
if ( hombres.availablePermits() == 5) {
System.out.println("Entró una mujer al baño"); // Woman gets in
try { hombres.acquire(); } catch (InterruptedException ex) { }
}
else {
System.out.println("Mujer en espera"); // Woman should wait
}
}
public synchronized void SalidaMujeres () {
System.out.println("Salió una mujer del baño");
mujeres.release(); // Woman gets out
}
public synchronized void SalidaHombres () {
System.out.println("Salió un hombre del baño");
hombres.release(); // Man gets out
}