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(); } } }