import java.util.concurrent.locks.*; import java.util.concurrent.locks.ReentrantLock; import java.util.*; public class Monitor{ private int antallBehandlere; private Lock laas = new ReentrantLock(); private LinkedList[] soknader = new LinkedList[10]; private int antallFerdige = 0; private Condition ingenSoknad = laas.newCondition(); public Monitor(int antallBehandlere){ this.antallBehandlere = antallBehandlere; //oppretter alle søknadene for(int i = 0; i < soknader.length; i++){ soknader[i] = new LinkedList(); } } public void leggTilSoknad(Soknad soknad){ laas.lock(); try{ if(soknad == null){ antallFerdige++; }else{ soknader[soknad.hentPrioritering()].add(soknad); } ingenSoknad.signal(); //signaliserer at det er lagt til en søknad }finally{ laas.unlock(); } } public Soknad hentUtSoknad(){ Soknad soknad = null; laas.lock(); try{ while(ingenSoknad() && (antallFerdige != antallBehandlere)){ ingenSoknad.await(); //venter til det blir signalisert om at det er klart } //hvis vi er ferdig signaliserer monitoren det med å sende null if(ingenSoknad() && antallFerdige == antallBehandlere){ ingenSoknad.signal(); //må åpne opp for de andre Boligsjefene som venter return null; } int teller = 0; while(soknader[teller].isEmpty()){ teller++; } soknad = soknader[teller].remove(0); }catch(Exception e){ System.out.println(e); }finally{ laas.unlock(); } return soknad; } //sjekker om det om arrayet har noen lenkelister med soknader i seg //returnerer true hvis det ikke er noen, false ellers private boolean ingenSoknad(){ for(int i = 0; i < soknader.length; i++){ if(!soknader[i].isEmpty()){ return false; } } return true; } }