Das Programm soll mittles Threads Objekte auf einen Stapel legen und wieder entnehmen. Beim Entnehmen kommt der Fehler: java.lang.IllegalMonitorStateException. Dabei habe ich die beiden Funktionen die sich in die Quere kommen könnten mittels Peterson-Algo verriegelt. Sieht vielleicht jemand den Fehler?
Ein Thread Consumer ruft die remove() Funktion auf und ein anderer Thread Producer ruft die add Funktion auf in einer Schleife, damit mehrere Objekte gestapelt und entnommen werden.
P.S.: Code in Java, hab PHP Ansicht genommen wegen der Lesbarkeit
PHP:
import java.util.LinkedList;
public class Stapel
{
private int t1Sleep = 100, t2Sleep = 10;
boolean flag0 = true, flag1 = false;
int turn=0;
private LinkedList<Item> stapel;
public Stapel()
{
stapel = new LinkedList<Item>();
}
public void add(Item item, int threadID) throws Exception
{
flag0 = true;
turn = 1;
while((flag1) && (turn == 1)){
try{
System.out.println("Produzent " +threadID +" wartet ");
wait();
}catch(Exception e){System.out.println(e);}
}
if(stapel.size()>=1){
stapel.add(item);
stapel.remove();
stapel.addFirst(item);
System.out.println("P. (Thread " +threadID+") : put Item into buffer with ID "+item.getId());
}
else{
stapel.addFirst(item);
stapel.add(item);
System.out.println("P. (Thread " +threadID+") : put Item into buffer with ID 1");
}
Thread.sleep(t1Sleep);
flag0 = false;
notifyAll();
}
public void remove() throws Exception
{
flag1 = true;
turn = 0;
while((flag0) && ((turn == 0))){
try{
System.out.println("Consumer wartet");
wait();
}catch(Exception e){}
}
System.out.println("Item removed from bruffer with ID " + stapel.get(1).getId());
stapel.remove(1);
Thread.sleep(t2Sleep);
flag1 = false;
notifyAll();
}
/*
* Hilfsfunktionen
*/
public Item getFirst()
{
return stapel.getFirst();
}
public int size()
{
return stapel.size();
}
}
Ein Thread Consumer ruft die remove() Funktion auf und ein anderer Thread Producer ruft die add Funktion auf in einer Schleife, damit mehrere Objekte gestapelt und entnommen werden.
P.S.: Code in Java, hab PHP Ansicht genommen wegen der Lesbarkeit