import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.Condition; public class BrusEksempel { public static void main(String[] args) { int antallKjopere = 3; int brusPerPers = 5; int kapasitet = 5; int antallPaafyll = (antallKjopere * brusPerPers)/ kapasitet; BrusMaskin maskin = new BrusMaskin(kapasitet); // lager kjopere Runnable kjopBrus = new KjopBrus(maskin, brusPerPers); for (int i = 0; i < antallKjopere; i++) { Thread kjoper = new Thread(kjopBrus); kjoper.start(); } // lager brusfyller Runnable fyllBrus = new FyllBrus(maskin, antallPaafyll); Thread fyller = new Thread(fyllBrus); fyller.start(); } } class BrusMaskin { // Brusmaskinen er en monitor private final Lock brusLaas = new ReentrantLock(); private final Condition harBrusTilSalgs = brusLaas.newCondition(); private final Condition trengerPaafyll = brusLaas.newCondition(); private final int kapasitet; private int brusTeller; public BrusMaskin(int kapasitet) { this.kapasitet = kapasitet; brusTeller = 0; } public void kjopBrus() { brusLaas.lock(); try { while(brusTeller == 0) { harBrusTilSalgs.await(); } System.out.println("Kjoper brus, antall igjen er " + --brusTeller); if (brusTeller == 0) { System.out.println("Maskinen trenger paafyll"); trengerPaafyll.signal(); } } catch (InterruptedException e) { System.out.println("Avbrutt under bruskjop"); } finally { brusLaas.unlock(); } } public void fyllBrus() { brusLaas.lock(); try { while(brusTeller > 0) { trengerPaafyll.await(); } brusTeller = kapasitet; System.out.printf("Maskinen er fylt opp. Det er %d brus i maskinen%n", brusTeller); harBrusTilSalgs.signalAll(); } catch (InterruptedException e) { System.out.println("Avbrutt under paafyll"); } finally { brusLaas.unlock(); } } } // slutt BrusMaskin-klasse class KjopBrus implements Runnable { private BrusMaskin maskin; private int antallKjop; public KjopBrus(BrusMaskin maskin, int antallKjop) { this.maskin = maskin; this.antallKjop = antallKjop; } public void run() { for (int i = 0; i < antallKjop; i++) { try { Thread.sleep(1000); } catch (InterruptedException e) {} maskin.kjopBrus(); } } } // slutt KjopBrus-klasse class FyllBrus implements Runnable { private BrusMaskin maskin; private int antallPaafyll; public FyllBrus(BrusMaskin maskin, int antallPaafyll) { this.maskin = maskin; this.antallPaafyll = antallPaafyll; } public void run() { for (int i = 0; i < antallPaafyll; i++) { try { Thread.sleep(1000); } catch (InterruptedException e) {} maskin.fyllBrus(); } } } // slutt FyllBrus-klasse