import java.util.concurrent.CountDownLatch; /** * Denne klassen representerer selve papirflyfabrikken. */ public class Papirflyfabrikk { final int MAKS_ANTALL_PAPIRFLY; int antBrettere, antKastere; SamlebaandMonitor samlebaand; CountDownLatch brettereFerdig, kastereFerdig; Thread[] brettere, kastere; boolean erStengt = false; public Papirflyfabrikk( int maksPapirfly, int antBrettere, int antKastere ) { MAKS_ANTALL_PAPIRFLY = maksPapirfly; this.antBrettere = antBrettere; this.antKastere = antKastere; samlebaand = new SamlebaandMonitor(maksPapirfly, this); brettere = new Thread[antBrettere]; kastere = new Thread[antKastere]; brettereFerdig = new CountDownLatch(antBrettere); kastereFerdig = new CountDownLatch(antKastere); } /** * Denne metoden prøver å sette legge et papirfly på * samlebåndet * * @param traadId - Id-en til tråden som prøver å legge til * et papirfly */ public void lagPapirfly(int traadId) { try { samlebaand.settInn(traadId); } catch (InterruptedException e) { e.printStackTrace(); } } /** * Denne metoden prøver å hente ut et papirfly fra samlebåndet * * @param traadId - Id-en til tråden som prøver å hente ut et * papirfly */ public void kastPapirfly(int traadId) { try { samlebaand.hentUt(traadId); } catch (InterruptedException e) { e.printStackTrace(); } } /** * Denne metoden åpner fabrikken og setter i gang alle trådene. * Når alle trådene er ferdige stenges fabrikken. */ public void startFabrikk() { System.out.println("Fabrikken åpner."); for (int i = 0; i < antBrettere; i++) { brettere[i] = new Thread(new PapirflyBretter(i, this, 10, brettereFerdig)); brettere[i].start(); } for (int i = 0; i < antKastere; i++) { kastere[i] = new Thread(new PapirflyKaster(i, this, 10, kastereFerdig)); kastere[i].start(); } for (Thread p : brettere) { try { p.join(); } catch (InterruptedException e) { e.printStackTrace(); } } for (Thread p : kastere) { try { p.join(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("Fabrikken er stengt for i dag."); } }