import java.util.ArrayList; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; class ConditionTest { public static void main(String[] args) { Monitortest monitor = new Monitortest(); for (int i = 0; i < 1000; i++) { new Thread(new Fjerner(monitor)).start(); new Thread(new Leggertil(monitor)).start(); } } } class Fjerner implements Runnable { Monitortest monitor = new Monitortest(); public Fjerner(Monitortest m){ this.monitor = m; } @Override public void run() { try { monitor.fjern(); System.out.println("fjernet"); } catch (InterruptedException e) { } } } class Leggertil implements Runnable { Monitortest monitor = new Monitortest(); public Leggertil(Monitortest m){ this.monitor = m; } @Override public void run() { monitor.leggTil("x"); System.out.println("la til"); } } class Monitortest{ ArrayList beholder = new ArrayList<>(); private final Lock laas = new ReentrantLock(); Condition ikkeTom = laas.newCondition(); public void leggTil(String s){ laas.lock(); try{ beholder.add(s); ikkeTom.signalAll(); } finally{ laas.unlock(); } } public void fjern() throws InterruptedException{ laas.lock(); try{ while(hentSize()==0){ ikkeTom.await(); } beholder.remove(0); } finally{ laas.unlock(); } } public int hentSize(){ laas.lock(); try { return beholder.size(); } finally { laas.unlock(); } } }