import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CountDownLatch; import java.util.concurrent.CyclicBarrier; // Arbeider som ikke tar inn noen barriere class Arbeider implements Runnable { private int id; private TellerMonitor teller; public Arbeider(int id, TellerMonitor teller) { this.id = id; this.teller = teller; } public void run() { System.out.println("Traad " + id + " starter! Felles teller: " + teller.hentTeller()); for (int i = 0; i < 10000; i++) { teller.oekTeller(); } System.out.println("Traad " + id + " er ferdig. Felles teller: " + teller.hentTeller()); } } // Arbeider som bruker CountDownLatch class ArbeiderCDL implements Runnable { private int id; private TellerMonitor teller; private CountDownLatch barriere; public ArbeiderCDL(int id, TellerMonitor teller, CountDownLatch barriere) { this.id = id; this.teller = teller; this.barriere = barriere; } public void run() { System.out.println("Traad " + id + " starter! Felles teller: " + teller.hentTeller()); for (int i = 0; i < 10000; i++) { teller.oekTeller(); } System.out.println("Traad " + id + " er ferdig. Felles teller: " + teller.hentTeller()); // Sier ifra til barrieren at denne traaden er ferdig naa barriere.countDown(); } } // Arbeider som bruker CyclicBarrier class ArbeiderCB implements Runnable { private int id; private CyclicBarrier barriere; public ArbeiderCB(int id, CyclicBarrier barriere) { this.id = id; this.barriere = barriere; } public void run() { int antallHei = 3; for (int i = 0; i < antallHei; i++) { System.out.println("Traad " + id + " sier 'Hei!' for " + (i + 1) + ". gang"); // Alle traadene venter til alle er ferdig med sitt 1. 'Hei!' foer // de alle sammen gaar videre til det 2. 'Hei!'-et // Det samme skjer igjen foer det 3. 'Hei!'-et try { barriere.await(); } catch (InterruptedException | BrokenBarrierException e) { System.exit(1); } } } }