import java.util.concurrent.Semaphore; import java.util.logging.Level; import java.util.logging.Logger; public class Main { static Semaphore Zakaznici=new Semaphore(0); static Semaphore Holic=new Semaphore(0); static Semaphore Sedadla=new Semaphore(1); static int POCET_KRESEL=2; static void Pozadavek(Semaphore s) { try { s.acquire(); } catch (InterruptedException ex) { Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); } } static void Uvolneni(Semaphore s) { s.release(); } static class vlaknoHolice extends Thread { synchronized void zvysPocet(){POCET_KRESEL++;} synchronized void snizPocet(){POCET_KRESEL--;} synchronized int vratPocet(){return POCET_KRESEL;} synchronized boolean jePrazdno(){return POCET_KRESEL==MAX;} int MAX; vlaknoHolice(){MAX=POCET_KRESEL;} @Override public void run() { System.out.println("Holic otevrel holicstvi"); //holič je nekonečná smyčka - bud dělá mebo je uspanej while(true) { //uspani if(jePrazdno()) { System.out.println("Holic usnul"); try{wait();}catch(Exception e){} } // Pozadavek(Zakaznici); Pozadavek(Sedadla); //holí System.out.println("Holic holi zakaznika..."); try{sleep(4000);}catch(Exception e){} zvysPocet(); // Uvolneni(Holic); Uvolneni(Sedadla); // try{sleep(1000);}catch(Exception e){} System.out.println("Holic uklizi..."); } } } static class VlaknoZakaznik extends Thread { int ID; vlaknoHolice hol; VlaknoZakaznik(int ID, vlaknoHolice h){this.ID=ID;hol=h;} @Override public void run() { System.out.println("Zakaznik # "+ID+" prisel do holicstvi"); if(hol.vratPocet()>0) { //probuzeni holice if(hol.jePrazdno()) { try{hol.notify();}catch(Exception e){} System.out.println("Holic byl probuzen"); } // hol.snizPocet(); Pozadavek(Sedadla); Uvolneni(Zakaznici); Uvolneni(Sedadla); Pozadavek(Holic); System.out.println("Zakaznik # "+ID+" byl uspesne oholen"); // }else{ Uvolneni(Sedadla); System.out.println("Zakaznik # "+ID+" odesel neoholen"); } } } public static void main(String[] args) { vlaknoHolice h=new vlaknoHolice(); h.start(); VlaknoZakaznik z=new VlaknoZakaznik(1,h); z.start(); for(int i=1;i<10000;i++){i=i;} VlaknoZakaznik z2=new VlaknoZakaznik(2,h); z2.start(); for(int i=1;i<10000;i++){i=i;} VlaknoZakaznik z3=new VlaknoZakaznik(3,h); z3.start(); } }