FACULTAD DE CIENCIAS DE LA COMPUTACION
 
 
 

Barberia con semaforos

import Semaforo.*;

class Barberia
{
public static void main(String ar[])
{
Cliente c = new Cliente();

ComunBarberia cb = new ComunBarberia();

SalaDeAfeitar a = new SalaDeAfeitar(cb, c);
SalaDeEspera e = new SalaDeEspera(cb, c);

System.out.println("\n\t\tPrograma BARBERIA Semaforos\n");

a.start();
e.start();
}
}

class Cliente //genera clientes
{
Lista cliente = new Lista();
Lista clienteAux = new Lista();

int num_cliente;

public Cliente()
{
cliente.iniciarAuxiliar();
clienteAux.iniciarAuxiliar();
}

void insertaCliente(Object i)
{
cliente.insertarCliente(i);
clienteAux.insertarCliente(i);
}

Object proximoCliente()
{
return cliente.proximoCliente();
}

boolean existenMasClientes()
{ return cliente.existenMasClientes();}

void iniciarAux()
{
cliente.iniciarAuxiliar();
clienteAux.iniciarAuxiliar();
}

void vaciarLista()
{
cliente.vaciarLista();
}
}

class ComunBarberia
{
SemaforoBinario salaDeEspera = new SemaforoBinario(1);
SemaforoBinario salaDeAfeitar = new SemaforoBinario(0);
SemaforoBinario auxiliar = new SemaforoBinario(0);
}

class Lista
{
Nodo Inicio, actual, siguiente;

Lista()
{
Inicio = null;
siguiente = Inicio;
}

void insertarCliente(Object x)
{
Nodo aux;
if(this.Inicio==null)
{
Inicio = new Nodo(x);
}
else
{
aux = this.Inicio;
while(aux.liga != null)
aux = aux.liga;
aux.liga = new Nodo(x);
}
}

Object proximoCliente()
{
Nodo aux;

if(actual==null)
return null;
else
aux = actual;
actual = actual.liga;
//siguiente = actual;
return aux.dato;
}

void iniciarAuxiliar()//sirve para colocar un apuntador auxiliar al inicio de la lista
{
//Inicio = null;
actual = this.Inicio;
}

void vaciarLista()
{
actual = Inicio = null;
}

boolean existenMasClientes()
{
if(actual!=null)
return true;
else return false;
}
}

class Nodo
{
Object dato;

Nodo liga;

public Nodo(Object x)
{
dato = x;
liga = null;
}
}

class SalaDeAfeitar extends Thread
{
ComunBarberia cba = new ComunBarberia();
Cliente cliente;

public SalaDeAfeitar(ComunBarberia cb,Cliente l)
{
cliente = l;
this.cba = cb;
}

public void run()
{
Integer cliente_num;
int j=0;

while(j<2)
{
// cba.auxiliar.WAIT();
cba.salaDeAfeitar.WAIT();

cliente.iniciarAux();

System.out.println("El cliente despierta al barbero.\n");

while(cliente.existenMasClientes())
{
cliente_num = ((Integer)(cliente.proximoCliente()));
System.out.println("\tEntra cliente #"+cliente_num+" a la sala de Afeitar");

try{sleep(300);}catch(Exception e){}

System.out.println("\t Sale el cliente #"+cliente_num+" afeitado.");
}
cliente.vaciarLista();

System.out.println("\nEl barbero duerme. \n");

j++;
cba.salaDeEspera.SIGNAL();
}
}
}

class SalaDeEspera extends Thread
{
ComunBarberia c;
Cliente cliente;
int k = 0;
public SalaDeEspera(ComunBarberia cb,Cliente l)
{
cliente = l;
this.c = cb;

}

public void run()
{
int j=0;

while(j<2)
{
c.salaDeEspera.WAIT();

for(int i=0;i<3;i++)
{
cliente.insertaCliente(new Integer(k));
System.out.println("Entro a la barberia el cliente #"+k);
try{sleep(300);}catch(Exception e){}
k++;
}
System.out.println("");
//genera clientes por medio de un random
// si hay clientes espera con ellos

j++;
c.salaDeAfeitar.SIGNAL();
}
}
}

Ejecucion del Programa:

Barberia



 




 
     

 

 

 

 

     
Hosted by www.Geocities.ws

1