Você deve fazer este EP em Java, usando threads Java e os recursos para sincronização entre threads oferecidos pela linguagem (métodos/blocos synchronized, operações wait(), notify() e notifyAll()). Se possível evite o uso de notifyAll(), que facilita os algoritmos mas tende a penalizar o desempenho.
Note que a solução vista em classe para o caso de um barbeiro só (seção 5.2.5 do livro do Andrews) usou um monitor com três variáveis de condição. No caso mais geral de barbeiros você certamente vai precisar de mais de uma variável de condição. O desafio aqui é implementar em Java algo equivalente a um monitor com múltiplas variáveis de condição. Ler a seção 3.7 (e especificamente o ítem 3.7.3) do livro do Doug Lea deve ajudar você nessa tarefa.