import java.util.concurrent.locks.*; /** * Denne klassen er en monitor som passer på at flere * tråder ikke kan aksessere samlebåndet på fabrikken * samtidig. Dette gjøres med en lås, samt to conditions: * * 1) ikkeFullt, som papirflybretterne må vente på dersom * det ikke er plass til flere papirfly * * 2) ikkeTomt, som papirflybretterne må vente på dersom * det ikke er flere papirfly på samlebåndet. */ public class SamlebaandMonitor { int samlebaandTeller, stoerrelse; Lock laas = new ReentrantLock(); Condition ikkeFullt = laas.newCondition(); Condition ikkeTomt = laas.newCondition(); Papirflyfabrikk fabrikk; SamlebaandMonitor(int stoerrelse, Papirflyfabrikk fabrikk) { this.stoerrelse = stoerrelse; this.fabrikk = fabrikk; } /** * Denne metoden prøver å legge et papirfly på samlebåndet, * men må eventuelt vente til det blir ledig plass. * * Dersom en tråd som venter får et signal mens fabrikken * er stengt, vil den slutte å prøve å legge papirfly på * samlebåndet. * * @param traadId - Id-en til tråden som prøver å legge til * et papirfly * @throws InterruptedException */ public void settInn(int traadId) throws InterruptedException { laas.lock(); try { while (samlebaandTeller == stoerrelse) { ikkeFullt.await(); if (fabrikk.erStengt) { return; } } System.out.printf("Papirflybretter nr. %d bretter et papirfly...%n", traadId); samlebaandTeller++; ikkeTomt.signalAll(); } finally { laas.unlock(); } } /** * Denne metoden prøver å hente ut et papirfly fra samle- * båndet, men må eventuelt vente hvis det er tomt. * * Dersom en tråd som venter får et signal mens fabrikken * er stengt, vil den slutte å prøve å hente papirfly fra * samlebåndet. * * @param traadId - Id-en til tråden som prøver å hente ut * et papirfly * @throws InterruptedException */ public void hentUt(int traadId) throws InterruptedException { laas.lock(); try { while (samlebaandTeller == 0) { ikkeTomt.await(); if (fabrikk.erStengt) { return; } } System.out.printf("Papirflykaster nr. %d kaster et papirfly!%n", traadId); samlebaandTeller--; ikkeFullt.signalAll(); } finally { laas.unlock(); } } }