import java.util.ArrayList; import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.Condition; public class Test { public static void main(String[] args) { Monitor m = new Monitor(); Runnable k = new Kokk(m); Runnable s = new Servitor(m); Thread tk = new Thread(k); Thread ts = new Thread(s); tk.start(); ts.start(); } } class Kokk implements Runnable { private Monitor monitor; Kokk(Monitor m) { monitor = m; } @Override public void run() { for (int i =0 ; i < 10000; i++) { try { Thread.sleep(3000); monitor.settPaaBord("Hamburger."); } catch (InterruptedException e) { System.out.println(e); } } System.out.println("Kokk ferdig"); } } class Servitor implements Runnable { private Monitor monitor; Servitor(Monitor m) { monitor = m; } @Override public void run() { for (int i =0 ; i < 10000; i++) { System.out.println(monitor.hentTallerken()); } System.out.println("Servitor ferdig"); } } class Monitor { private ArrayList bord = new ArrayList<>(); private ReentrantLock lock = new ReentrantLock(); private Condition ikkeTom = lock.newCondition(); void settPaaBord(String tallerken) { lock.lock(); try { bord.add(tallerken); ikkeTom.signalAll(); } finally { lock.unlock(); } } public String hentTallerken() { lock.lock(); try { while (bord.isEmpty()) { ikkeTom.await(); } return bord.remove(0); } catch (InterruptedException e) { System.out.println(e); } finally { lock.unlock(); } return "Tom tallerken."; } }