import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.CountDownLatch; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; public class Brusautomat { private int kapasitet, antallBrus; private Lock laas = new ReentrantLock(); private Condition tom = laas.newCondition(); // Condition for nar automaten er tom private Condition fyltPaa = laas.newCondition(); // Condition for nar automaten er fylt paa igjen private CountDownLatch cdl; public Brusautomat(int kapasitet, int antallBrusdrikkere) { this.kapasitet = kapasitet; antallBrus = kapasitet; cdl = new CountDownLatch(antallBrusdrikkere); // CountDownLatch for aa holde styr paa ferdige brusdrikkere } public boolean refill() { laas.lock(); try { while (antallBrus > 0) { if (cdl.getCount() == 0) { // Hvis alle er ferdige returneres false for aa si at alle brusdrikkere er ferdig return false; } tom.await(); // Venter paa at automaten blir tom foer det fylles paa } antallBrus = kapasitet; // Fyller maskinen opp fyltPaa.signalAll(); // Signaliserer til alle brusdrikkere om at det naa er fylt paa System.out.println("Brusmaskinen er fylt paa."); } catch (InterruptedException e) { System.out.println("Noe feil skjedde i refill"); } finally { laas.unlock(); } return true; // Returnerer true om brusdrikkerne ikke er ferdig enda } public void kjopBrus() { laas.lock(); try { if (antallBrus == 0) { fyltPaa.await(); // Hvis det er tomt for brus saa maa man vente paa at det blir fylt paa } antallBrus--; System.out.println("En brus er kjopt."); if (antallBrus == 0) { tom.signal(); // Hvis det er tomt etter brusen er kjopt gir man beskjed om at det maa fylles paa } } catch (InterruptedException e) { System.out.println("Noe feil skjedde i kjopBrus"); } finally { laas.unlock(); } } public void countDown() { // Metode som lar brusdrikkerne telle ned paa CountDownLatch-objektet cdl.countDown(); if (cdl.getCount() == 0) { // Hvis alle brusdrikkere er ferdig er telleren 0 laas.lock(); try { tom.signal(); // Gir da et siste signal til Maskinfylleren for at det ikke skal bli vranglaas } finally { laas.unlock(); } } } }