import java.util.concurrent.CountDownLatch; import java.util.concurrent.CyclicBarrier; public class BrukBarrierer { public static void main(String[] args) { // To forskjellige maater aa gjoere det samme paa: brukJoin(2); brukCountDownLatch(2); // Loeser et annet problem: Oppgave 2 uke 11 brukCyclicBarrier(8); } //// // La main-traaden vente til alle er ferdige vha. join // public static void brukJoin(int antallTraader) { System.out.println("=-={ join }=-=-=-=-=-=-=-=-=-=-=-=-="); TellerMonitor monitor = new TellerMonitor(); // Starter alle traadene og legger dem inn i arrayet Thread[] alleTraader = new Thread[antallTraader]; for (int i = 0; i < antallTraader; i++) { Runnable arbeider = new Arbeider(i, monitor); Thread traad = new Thread(arbeider); traad.start(); alleTraader[i] = traad; } // Main venter til alle traadene er ferdige ... for (Thread traad : alleTraader) { try { traad.join(); } catch (InterruptedException e) { return; } } // ... foer den gaar vidrere hit System.out.println("join: Alle traadene er ferdige aa telle!"); System.out.println("=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n"); } //// // La main-traaden vente til alle er ferdige vha. en CountDownLatch // public static void brukCountDownLatch(int antallTraader) { System.out.println("=-={ CountDownLatch }=-=-=-=-=-=-=-="); TellerMonitor monitor = new TellerMonitor(); CountDownLatch barriereCDL = new CountDownLatch(antallTraader); // Parameteren vi sender med avgjoer hvor mange kall paa // barriere.countDown() som kreves foer "bommen" aapnes og // slipper videre alle traader som har kalt paa barriere.await() // Starter alle traadene, sender med barrieren som parameter for (int i = 0; i < antallTraader; i++) { Runnable arbeider = new ArbeiderCDL(i, monitor, barriereCDL); Thread traad = new Thread(arbeider); traad.start(); } // Main ligger aa venter helt til barrieren "aapner bommen". Bommen // blir aapnet naar barrieren har fatt nok kall paa barriere.countDown(). // Traadene kaller paa countDown én gang hver, helt i slutten av run() try { barriereCDL.await(); } catch (InterruptedException e) { return; } System.out.println("CountDownLatch: Alle traadene er ferdige aa telle!"); System.out.println("=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n"); } //// // Loesning paa oppgave 2 fra seminar uke 11 // Her er det traadene som skal vente paa hverandre foer de fortsetter // // Main-traaden vil ikke vente paa traadene slik som den gjorde over, den // bare starter dem // public static void brukCyclicBarrier(int antallTraader) { System.out.println("=-={ CyclicBarrier (task2 u11) }=-=-"); CyclicBarrier barriereCB = new CyclicBarrier(antallTraader); // Parameteren vi sender med avgjoer hvor traader som maa si barriere.await() // "bommen" aapnes og alle de ventende traadene faar lov til aa fortsette // Starter alle traadene, sender med barrieren som parameter for (int i = 0; i < antallTraader; i++) { Runnable arbeider = new ArbeiderCB(i, barriereCB); Thread traad = new Thread(arbeider); traad.start(); } // Denne vil som oftest havne midt inni alle 'Hei'-ene fra traadene System.out.println("=-={ Main-traaden er ferdig naa }=-="); } }