FACULTAD DE CIENCIAS DE LA COMPUTACION
 
 
 

Baño con semaforos

class banoSem
{
protected static final SemaforoBinario net=new SemaforoBinario (0);
protected static final SemaforoGeneral hnet=new SemaforoGeneral(2);
protected static final SemaforoGeneral mnet=new SemaforoGeneral(6);

public static void main (String args[])
{
bano b=new bano(net,hnet,mnet);
Thread h=new Thread(new hombre (b));
Thread m=new Thread (new mujer(b));
h.start();
m.start();
}
}

class bano
{
SemaforoBinario ent;
SemaforoGeneral gh;
SemaforoGeneral gm;

public int hesp;
public int mesp;

public bano (SemaforoBinario b, SemaforoGeneral g1, SemaforoGeneral g2)
{
this.ent=b;
this.gh=g1;
this.gm=g2;
}

public void ocupado(int i,int j)
{
if(j==1)
{
System.out.println("Mujer"+(i+1)+" salio del bano");
gh.SIGNAL();
ent.SIGNAL();
}
else
{
System.out.println("Hombre"+(i+1)+" salio del bano");
ent.SIGNAL();
gm.SIGNAL();
}
}

public void muj(int a)
{
hesp++;
ent.WAIT();
if(hesp>0)
mesp--;
System.out.println("Mujer:"+(a+1)+"entro al bano");
if(gm.contador<=0)
ent.WAIT();
gm.WAIT();
ocupado(a,1);
}

public void hom(int b)
{
ent.SIGNAL();
if(hesp>0 && gh.contador==2)
{
gh.WAIT();
hesp--;
System.out.println("Hombre:"+(b+1)+"entro al bano");
ocupado(b,2);
}
}
}

class hombre extends banoSem implements Runnable
{
private bano b;

public hombre(bano b1)
{ this.b=b1; }

public void run()
{
for(int count=0;count<6; count++)
{
System.out.println("Hombre: "+(count+1)+ " intentando entrar al bano");
b.hom(count);
}
}
}

class mujer extends banoSem implements Runnable
{
private bano b;
public mujer(bano b1)
{this.b=b1;}
public void run()
{
for (int count=0; count<4; count++)
{
System.out.println("Mujer: "+(count+1)+" intentando entrar la bano");
b.muj(count);
}
}
}

class SemaforoBinario
{
protected int contador = 0;

public SemaforoBinario (int valorInicial)
{
contador = valorInicial;
}

synchronized public void WAIT ()
{
while (contador == 0)
try {
wait();
}
catch (Exception e) {}
contador--;
}

synchronized public void SIGNAL ()
{
contador = 1;
notify();
}
synchronized public int valor(){ return contador; }
}

class SemaforoGeneral extends SemaforoBinario
{
public SemaforoGeneral(int valorinicial)
{
super(valorinicial);
}
synchronized public void SIGNAL()
{
contador++;
notify();
}
synchronized public void inicializa(int valor)
{
contador = valor;
}
}

Ejecucion del Programa:

Bano


 




 
     

 

 

 

 

     
Hosted by www.Geocities.ws

1