import java.util.concurrent.CountDownLatch; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; import java.util.Random; /* *Et gitt antall tr?der, deltagere, genererer *et tilfeldig tall. Deltageren som leverer det *h?yeste tallet vinner. For at en deltager skal * vite at han har vunnet, m? de kunne vente til *alle deltagere er alle deltagere */ public class NedtellingEksempel { private static final int ANT_TRAADER = 10; public static void main(String[] args) { //Lager en barriere, som settes til vent frem til //ANT_TRAADER har kalt p? countdown() CountDownLatch alleFerdigBarriere = new CountDownLatch(ANT_TRAADER); Monitor monitor = new Monitor(); //Lage og starte traader for(int i = 0; i < ANT_TRAADER; i++) { new Thread(new Deltager(monitor, alleFerdigBarriere)).start(); } //venter vi p? alle deltagere til ? levere nummer try { alleFerdigBarriere.await(); }catch (InterruptedException e){ } System.out.println("Storste: " + monitor.hentStorste()); } } //Klasse for ? lagre hoyeste tall/nummer class Monitor { private final Lock laas = new ReentrantLock(); private int storste; public int hentStorste() { return storste; } public void setStorste(int tall) { laas.lock(); try { storste = Math.max(storste, tall); } finally { laas.unlock(); } } } class Deltager implements Runnable{ private final Monitor monitor; private final CountDownLatch alleFerdigBarriere; private final int id; private static int antallDeltagereAksjon = 0; public Deltager(Monitor monitor, CountDownLatch alleFerdigBarriere) { id = antallDeltagereAksjon++; this.monitor = monitor; this.alleFerdigBarriere = alleFerdigBarriere; } public void run() { //Genererer og tildeler nummer til hver deltager Random random = new Random(); int nummer = random.nextInt(100); System.out.printf("Deltager #%d genererte nummer: %d\n", id, nummer); monitor.setStorste(nummer); //raportere til bariere at vi har gjort oppgave, deretter vente p? resterende deltagere alleFerdigBarriere.countDown(); try { alleFerdigBarriere.await(); } catch (InterruptedException e) { } if(nummer == monitor.hentStorste()) { System.out.println("Deltager " + id + " vant!"); } } }