import java.util.LinkedList; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class Monitor { private LinkedList[] lister = new LinkedList[10]; private int antall = 0; private Lock laas = new ReentrantLock(); private Condition ingenSoknader = laas.newCondition(); private int antallBehandlere; public Monitor(int antallBehandlere){ this.antallBehandlere = antallBehandlere; for(int i = 0; i < lister.length; i++){ lister[i] = new LinkedList(); } } public void leggTil(Soknad soknad){ laas.lock(); try{ if(soknad == null) { antallBehandlere--; if(antallBehandlere == 0) ingenSoknader.signalAll(); return; } lister[soknad.hentPrio()].add(soknad); antall++; ingenSoknader.signalAll(); }finally{ laas.unlock(); } } public Soknad taUtSoknad(){ laas.lock(); try { while(antall < 1) { if(antallBehandlere == 0) return null; ingenSoknader.await(); } antall--; int teller = 0; //antar at det må finnes noe while(lister[teller].isEmpty()) teller++; return lister[teller].remove(0); } catch (Exception e) { return null; }finally{ laas.unlock();; } } }