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();
}
}
}