import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class BardiskMonitor { private final Lock lock = new ReentrantLock(); private Condition erIkkeFull = lock.newCondition(); private Condition erIkkeTom = lock.newCondition(); private Leveranse[] leveranser = new Leveranse[10]; private int leveranseTeller = 0; private int antRetter; private int antRetterFerdig = 0; public BardiskMonitor(int antKokker){ this.antRetter = antKokker * 10; } public void settFram(Leveranse l) { lock.lock(); try{ // Endret fra if til while. Når du bruker .signal() funker if, // når du bruker signalAll() må du bruke while slik at while(leveranseTeller >= leveranser.length){ erIkkeFull.await(); } antRetterFerdig++; leveranser[leveranseTeller] = l; leveranseTeller++; erIkkeTom.signalAll(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { lock.unlock(); } } public Leveranse leverLeveranse(){ Leveranse hentet = null; lock.lock(); try{ while(leveranseTeller <= 0) { if(erFerdig()) return null; erIkkeTom.await(); } leveranseTeller--; hentet = leveranser[leveranseTeller]; erIkkeFull.signalAll(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { lock.unlock(); } return hentet; } public boolean erFerdig() { Boolean erTom = leveranseTeller == 0; Boolean kokkeneErFerdig = antRetter == antRetterFerdig; //todo // System.out.println(antRetter + " " + antRetterFerdig); return erTom && kokkeneErFerdig; } }