import java.util.*; import java.util.concurrent.locks.*; // Monitor-klassen vår public class FruktBod { ArrayList frukter = new ArrayList<>(); ReentrantLock lås = new ReentrantLock(); Condition harFrukt = lås.newCondition(); boolean ferdig = false; // Denne variabelen skal bestemme om frukttreet er 'tørt' eller ikke public void leggTilFrukt(String frukt) { lås.lock(); // Må sørge for trådsikkerhet try { frukter.add(frukt); harFrukt.signalAll(); // Vekke alle ventende kunder } finally { lås.unlock(); } } public String selgFrukt(String frukt) { lås.lock(); try { while (!ferdig && !frukter.contains(frukt)) { harFrukt.await(); } if (!frukter.contains(frukt)) { System.out.println("Vi er tomme for " + frukt); return null; } frukter.remove(frukt); return frukt; } catch (InterruptedException e) { System.out.println("Tråd avbrutt"); return null; } finally { lås.unlock(); } } public void markerSomFerdig() { lås.lock(); try { ferdig = true; harFrukt.signalAll(); // Viktig å signalisere evt. ventende tråder } finally { lås.unlock(); } } }