import java.util.concurrent.locks.*; import java.util.ArrayList; public class KnivMonitor { private Lock laas = new ReentrantLock(); private Condition ikkeTom = laas.newCondition(); private ArrayList kniver = new ArrayList<>(); private int antallKnivProdusenter; private int antallFerdige = 0; private boolean erFerdigProdusert = false; public KnivMonitor(int antall) { antallKnivProdusenter = antall; } public void settInn(Kniv kniv) { laas.lock(); try { kniver.add(kniv); ikkeTom.signalAll(); } finally { laas.unlock(); } } public void signaliserFerdig() { laas.lock(); try { antallFerdige++; if (antallFerdige == antallKnivProdusenter) { erFerdigProdusert = true; } } finally { laas.unlock(); } } public ArrayList taUtToKniver() { laas.lock(); try { while (antallKniver() < 2) { if (erFerdigProdusert) { return null; } ikkeTom.await(); } ArrayList retur = new ArrayList<>(); retur.add(kniver.remove(0)); retur.add(kniver.remove(0)); return retur; } catch (InterruptedException e) { System.out.println("Avbrutt..."); System.exit(-1); } finally { laas.unlock(); } return null; } public int antallKniver() { laas.lock(); try { return kniver.size(); } finally { laas.unlock(); } } }