import java.util.concurrent.CountDownLatch; /** * Denne klassen representerer en arbeider som kaster * papirfly på papirflyfabrikken. */ public class PapirflyKaster implements Runnable{ Papirflyfabrikk fabrikk; int id, papirflyPerDag; CountDownLatch ferdig; public PapirflyKaster(int id, Papirflyfabrikk fabrikk, int papirflyPerDag, CountDownLatch ferdig) { this.id = id; this.papirflyPerDag = papirflyPerDag; this.fabrikk = fabrikk; this.ferdig = ferdig; } @Override public void run() { for (int i = 0; i < papirflyPerDag; i++) { fabrikk.kastPapirfly(id); if (fabrikk.erStengt) { System.out.printf("Papirflymaker nr. %d er ferdig for dagen.%n", id); ferdig.countDown(); return; } } System.out.printf("Papirflykaster nr. %d er ferdig for dagen.%n", id); /* Her teller vi ned og venter på en CountDownLatch * slik at vi kan være sikre på at koden etter ikke * blir kjørt før alle trådene er ferdige med koden * over. */ ferdig.countDown(); try { ferdig.await(); } catch (InterruptedException e) { e.printStackTrace(); } /* Stenger fabrikken og sier ifra til alle papirfly- * kasterne at de kan gå hjem for dagen. */ fabrikk.erStengt = true; fabrikk.samlebaand.laas.lock(); try { fabrikk.samlebaand.ikkeFullt.signalAll(); } finally { fabrikk.samlebaand.laas.unlock(); } } }