import java.util.ArrayList; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class Postterminal { private ArrayList vareListe = new ArrayList<>(); private Lock laas = new ReentrantLock(); private Condition ikkeTom = laas.newCondition(), ikkeFull = laas.newCondition(); private static final int MAKS_ANTALL_VARER = 20; private boolean ferdigLaget = false; public void leverVare(Vare vare) { laas.lock(); try { // Selve logikken til metoden while (vareListe.size() >= MAKS_ANTALL_VARER) { ikkeFull.await(); } vareListe.add(vare); System.out.println("En fabrikk leverte " + vare + " til postterminalen"); ikkeTom.signalAll(); } catch (InterruptedException e) { e.printStackTrace(); } finally { laas.unlock(); } } public Pakke hentPakke(Postbud bud) { laas.lock(); try { while (vareListe.size() == 0 && !ferdigLaget) { ikkeTom.await(); } // er fabrikkene ferdig? og, er alle varer hentet ut? if (ferdigLaget && vareListe.size() == 0) { return null; } Vare fjernet = vareListe.remove(0); Pakke pakke = new Pakke(fjernet, bud); System.out.println(bud.hentNavn() + " hentet " + fjernet.hentNavn() + " fra terminalen"); ikkeFull.signalAll(); return pakke; } catch (InterruptedException e) { e.printStackTrace(); return null; } finally { laas.unlock(); } } // Indikerer at fabrikkene er ferdig med å produsere for i dag // ventende postbud, skal slippe å vente public void ferdigLaget() { laas.lock(); try { ferdigLaget = true; ikkeTom.signalAll(); } finally { laas.unlock(); } } }