––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– filnavn: Stemmesystem.java ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– import java.util.ArrayDeque; public class Stemmesystem { private ArrayDeque stemmer; public Stemmesystem() { stemmer = new ArrayDeque<>(); } public void leggTilStemme(int stemme) { stemmer.push(stemme); } public int hentStemme() { if (tom()) { return -1; } else { return stemmer.pop(); } } public boolean tom() { return stemmer.isEmpty(); } } ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– filnavn: MonitorStemmesystem.java ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class MonitorStemmesystem { private Stemmesystem stemmesystem; private Lock laas; private Condition kanHente; public MonitorStemmesystem(Stemmesystem stemmesystem) { this.stemmesystem = stemmesystem; laas = new ReentrantLock(true); kanHente = laas.newCondition(); } public void leggTilStemme(int stemme) { laas.lock(); try { stemmesystem.leggTilStemme(stemme); kanHente.signalAll(); } finally { laas.unlock(); } } public int hentStemme() throws InterruptedException { laas.lock(); try { while (tom()) { kanHente.await(); } return stemmesystem.hentStemme(); } finally { laas.unlock(); } } public boolean tom() { laas.lock(); try { return stemmesystem.tom(); } finally { laas.unlock(); } } } ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– filnavn: Stemmekontor.java ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– import java.util.Random; import java.util.concurrent.CountDownLatch; public class Stemmekontor implements Runnable { private String sted; private MonitorStemmesystem monitor; private CountDownLatch antallStemmeurner; private Random generator; public Stemmekontor(String sted, MonitorStemmesystem monitor, CountDownLatch antallStemmeurner) { this.sted = sted; this.monitor = monitor; this.antallStemmeurner = antallStemmeurner; generator = new Random(); } @Override public void run() { int antallStemmerPerUrne = 100; while (antallStemmeurner.getCount() != 0) { for (int i = 0; i < antallStemmerPerUrne; i ++) { monitor.leggTilStemme(generator.nextInt(10)); // 0 <= stemme <= 9 } System.out.println(sted + " la til stemmer."); antallStemmeurner.countDown(); } } } ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– filnavn: Stemmeteller.java ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; public class Stemmeteller implements Runnable { private int id; private MonitorStemmesystem monitor; private CyclicBarrier tidForPause; public Stemmeteller(int id, MonitorStemmesystem monitor, CyclicBarrier tidForPause) { this.id = id; this.monitor = monitor; this.tidForPause = tidForPause; } @Override public void run() { try { int antallTalt = 0; int skalTelle = 100; int stemme; while (antallTalt < skalTelle) { stemme = monitor.hentStemme(); System.out.println(id + ": " + stemme); antallTalt ++; } System.out.println(id + " er klar for pause."); tidForPause.await(); System.out.println(id + " tar en pause."); } catch (InterruptedException e) { System.err.println("Traaden ble avbrutt."); return; } catch (BrokenBarrierException e) { System.err.println("Barrieren ble brutt."); return; } } } ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– filnavn: Hovedprogram.java ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– import java.util.concurrent.CountDownLatch; import java.util.concurrent.CyclicBarrier; public class Hovedprogram { public static void main(String[] args) throws InterruptedException { Stemmesystem stemmesystem = new Stemmesystem(); MonitorStemmesystem monitor = new MonitorStemmesystem(stemmesystem); /* Klargjor stemmekontorene */ int antallUrner = 10; CountDownLatch antallStemmeUrner = new CountDownLatch(antallUrner); Thread grunerlokka = new Thread(new Stemmekontor("Grunerlokka", monitor, antallStemmeUrner)); Thread blindern = new Thread(new Stemmekontor("Blindern", monitor, antallStemmeUrner)); /* Klargjor stemmetellerne */ int antallStemmetellere = Runtime.getRuntime().availableProcessors(); // 8 CyclicBarrier tidForPause = new CyclicBarrier(antallStemmetellere); Thread[] stemmetellere = new Thread[antallStemmetellere]; for (int id = 0; id < antallStemmetellere; id ++) { stemmetellere[id] = new Thread(new Stemmeteller(id, monitor, tidForPause)); } /* Setter stemmetellerne og stemmekontorene i gang */ for (Thread stemmeteller : stemmetellere) { stemmeteller.start(); } grunerlokka.start(); blindern.start(); antallStemmeUrner.await(); System.out.println("Stemmeurnene er lagt til."); } }