import java.util.concurrent.locks.*; import java.util.ArrayList; public class KnivMonitor { private Lock laas = new ReentrantLock(); private ArrayList kniver = new ArrayList<>(); private Condition ikkeTom = laas.newCondition(); private int antallKnivProdusenter; private int antallFerdigProduserte = 0; private boolean erFerdig = 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 { antallFerdigProduserte++; if (antallFerdigProduserte == antallKnivProdusenter) { erFerdig = true; } } finally { laas.unlock(); } } public int antallKniver() { laas.lock(); try { return kniver.size(); } finally { laas.unlock(); } } public ArrayList taUtToKniver() { laas.lock(); try { while (antallKniver() < 2) { if (erFerdig) { 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; } }