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:

|