import java.util.ArrayList; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.Condition; class Bord { private ArrayList kopper = new ArrayList<>(); private Lock l?s = new ReentrantLock(); private Condition ikkeTomt = l?s.newCondition(); private int totaltAntallKopper; public Bord(int totaltAntallKopper) { this.totaltAntallKopper = totaltAntallKopper; } public void serverKaffe(String kaffe) { l?s.lock(); try { kopper.add(kaffe); totaltAntallKopper--; ikkeTomt.signalAll(); } finally { l?s.unlock(); } } public String hentKaffe() throws InterruptedException { l?s.lock(); try { while (kopper.isEmpty() && totaltAntallKopper > 0) { ikkeTomt.await(); } if (!kopper.isEmpty()) { return kopper.remove(0); } return null; } finally { l?s.unlock(); } } }