import java.io.*; import java.lang.*; class Semaforo{ int value; public Semaforo() { value = 1; } public Semaforo(int value) { this.value = value; } public synchronized void up() { value++; notify(); } public synchronized void down() { while (value<=0) {try {wait();}catch(InterruptedException e){ }; } value--; } } class buffer { public Semaforo mutex = new Semaforo(1); public Semaforo barbiere ; // semaforo del barbiere public Semaforo clienti = new Semaforo(0); public int n; // numero di sedie occupate public int nsedie; // numero di sedie disponibili in totale public buffer(int nsedie,int nbarb) { this.nsedie = nsedie; barbiere = new Semaforo(nbarb); } } class cliente extends Thread{ buffer dato; int numero; // numero del cliente public cliente(buffer dato,int numero) { this.numero = numero; this.dato = dato; } public void run() { while(true){ dato.mutex.down(); if (dato.n < dato.nsedie) {// posto disponibile dato.n++; // cliente si siede dato.clienti.up(); dato.mutex.up(); dato.barbiere.down(); System.out.println("Cliente "+numero+" aspetta taglio"); } else // sala piena { System.out.println("Cliente "+numero+" sala piena"); dato.mutex.up(); } } } } class barbiere extends Thread { buffer dato; int numero; // numero del barbiere public barbiere(buffer dato,int numero) { this.dato = dato; this.numero = numero; } public void run() { while(true) { // barbiere lavora sempre System.out.println("Barbiere "+numero+" aspetto cliente"); dato.clienti.down(); dato.mutex.down(); dato.n--; // taglia i capelli dato.barbiere.up(); dato.mutex.up(); System.out.println("Barbiere "+numero+" sto tagliando i capelli"); } } } public class pcp25{ public static void main(String argv[]) { buffer cont= new buffer(3,2); cliente c1 = new cliente(cont,1); cliente c2 = new cliente(cont,2); cliente c3 = new cliente(cont,3); cliente c4 = new cliente(cont,4); cliente c5 = new cliente(cont,5); cliente c6 = new cliente(cont,6); cliente c7 = new cliente(cont,7); cliente c8 = new cliente(cont,8); barbiere b1 = new barbiere(cont,1); // inizializza dei berbiere barbiere b2 = new barbiere(cont,2); c1.start(); c2.start(); c3.start(); c4.start(); b1.start(); c5.start(); b2.start(); c6.start(); c7.start(); c8.start(); } }