Algoritmo Barbeiro Dorminhoco em Java

Olá pessoal sou novo por aqui no GUJ e novo também na linguagem Java, gostaria de saber o que é que está dando erro neste código abaixo, ele está sem nenhum erro de compilação, mas não consegue ser executado, alguém poderia me dar um HELP???


public class BarbeiroDorminhoco {

static final int MAXCLIENTES = 5;
static semaforo clientes = new semaforo(0);
static semaforo barbeiro = new semaforo(0);
static semaforo mutex = new semaforo(1);
static int waiting = 0,cont;
static cliente cli[]=new cliente [10];

public BarbeiroDorminhoco( ) //método construtor {

}

public static void main(String[] args) {

barbeiro barb = new barbeiro(1);
barb.start();

for(cont=0;cont<10;cont++)
	cli[cont]=new cliente(cont);

for(cont=0;cont<10;cont++)
	cli[cont].start();

}

}

===>>> Barbeiro

package barbeirodorminhoco;

public class barbeiro extends Thread {
private int id;

public barbeiro (int id) {
	this.id = id;
}
private void cortarCabelo() {
	System.out.println("Barbeiro cortando o cabelo");
try {
	sleep((int)(Math.random() * 1000));
}	
catch(Exception e) {
	System.out.println("Erro barbeiro cortando cabelo");
}
System.out.println("Barbeiro terminando");

}

public void run() {
	System.out.println(" Barbeiro chegou a barbearia");
	while (true) {
		BarbeiroDorminhoco.clientes.P();
		BarbeiroDorminhoco.mutex.P();
		BarbeiroDorminhoco.waiting=BarbeiroDorminhoco .waiting + 1;
		BarbeiroDorminhoco.barbeiros.V();
		BarbeiroDorminhoco.mutex.V();
		cortarCabelo();
	}
}

}

====>Cliente
package barbeirodorminhoco;

public class cliente extends Thread {
private int id;

public cliente (int id) {
	this.id = id;
}

private void cortarCabelo() {
	System.out.println("Cliente " + this.id + " cortando o cabelo");
}

public void run() {
	System.out.println("Cliente "+ this.id +" chegou a barbearia");
	BarbeiroDorminhoco.mutex.P();
	if ( BarbeiroDorminhoco.waiting < BarbeiroDorminhoco.MAXCLIENTES ) {
		BarbeiroDorminhoco.waiting++;
		BarbeiroDorminhoco.clientes.V();
		BarbeiroDorminhoco.mutex.V();
		BarbeiroDorminhoco.barbeiros.P();
		cortarCabelo();
	}
	else {
		System.out.println("Barbearia Cheia! Cliente " + this.id + " indo embora");
	BarbeiroDorminhoco.mutex.V();
	}
}

}

====>Semaforo
package barbeirodorminhoco;

public class semaforo {
private int value;
public semaforo(int v) {
value=v;
}

public synchronized void P() {
	while(value<=0) {
		try {
			wait();
		}
		catch (Exception e) {
			System.out.println("Erro na espera");
		}
	}
	value--;
}

public synchronized void V() {
	++value;
	notify(); //acorda proccesso
}

}


Desde já agradeço a atenção de todos!

Fernando Almeida
Graduando em Sistemas de Informação
Estácio - FIB

Comece por aqui.