Java Threads Fehler

vintner

Cadet 4th Year
Registriert
Mai 2010
Beiträge
95
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?
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 ;)
 
Google mal nach synchronized und java.

Denk das könnt für dich hilfreich sein.
Richtige Thread syncronisation dürftest du ja ned brauchen.
 
Du versuchst in nicht synchronisierten Blöcken wait bzw notify zu callen...
 
Wenn die Funktionen synchronized gesetzt werden gehen sie leider nicht mehr in die wait Schleife. Die laufen dann abwechselnd da sie ja synch. sind.
 
Zurück
Oben