Problem mit Threads (java Runnable mit wait und notify)

I2oxxi

Mitglied
Also, mal wieder ne Aufgabe aus der Uni wo ich häng, hab das auch schon bisl umgestellt aber iwie will das nicht wie ich will ^^
Ist ersma son Standart Erzeuger Verbraucher Beispiel, aber irgendwie will der nicht verbrauchen ;(

Code:
package supermarkt;

import java.util.Vector;

public class Erzeuger implements Runnable{
	
	private Vector<String> kunden;
	
	public Erzeuger(Vector<String> v)
	{
		this.kunden=v;
	}
	
	public synchronized void erzeuge()
	{
		String s = "Kunde "+ (int) (Math.random()*100);
		System.out.println(s + " erzeugt!");
		this.kunden.add(s);
		this.notify();
	}

	@Override
	public void run() 
	{
		try
		{
			while(true)
			{
					this.erzeuge();
					Thread.sleep((long) (Math.random()*2));
			}
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
	}

}

Code:
package supermarkt;

import java.util.Vector;

public class Verbraucher implements Runnable{

	private Vector<String> kunden;
	
	public Verbraucher(Vector<String> v)
	{
		this.kunden=v;
	}
	
	
	@Override
	public void run() 
	{
		try
		{
			while(true)
			{
				if(this.kunden.size()>0)
				{
					this.verbrauche();
					Thread.sleep((long) (6+Math.random()*4));
				}
			}
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
		
	}
	
	public synchronized void verbrauche()
	{	
		try
		{
			this.wait();
			System.out.println(this.kunden.get(0) + " verbraucht");
			this.kunden.remove(0);
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
	}

}

Code:
package supermarkt;

import java.util.Vector;

public class Supermarkt {

	public static void main(String[] args)
	{
		Vector<String> kunden = new Vector<String>();
		Erzeuger e = new Erzeuger(kunden);
		Verbraucher v = new Verbraucher(kunden);
		
		Thread t1 = new Thread(e);
		Thread t2 = new Thread(v);
		t1.start();
		t2.start();
	}
}

das wait hatte ich schon an vielen stellen aber entweder wird nix verbraucht oder ich bekomm ne java.lang.IllegalMonitorStateException

hoffe ihr könnt mir helfen. Runnable soll benutzt werden, also keine Vererbung von Thread. und ich will grade mit dem wait und notify das richtig verstehen, weil die aufgabe noch erweitert wird, das mehrere verbraucher sich zufällig aus dem vector bedienen, dafür ist das ja genau das richtige wenn ich jetz nicht total falsch liege oder? ^^
 
Zuletzt bearbeitet:
Ah, Mario ist wieder da ^^

Spaß ^^

Deine Monitore sind falsch. Synchronisierte Methoden sperren die eigene Instanz. Von daher war der Gedanke vielleicht nicht ganz verkehrt. Was du brauchst ist aber nicht die jeweilige Instanz zu synchronisieren, sondern die Vector-Instanz mit den Kunden.

Das heißt du brauchst einen synchronisierten Block, der das Attribut kunden sperrt, wenn du die Methoden wait() oder notify() aufrufen willst, da diese nicht synchronisiert sind. Bei den anderen Zugriffen, wie etwa add() und get() ist das nicht unbedingt nötig, da diese bereits synchronisiert sind.
 
mario xd
aber an dich erinner ich mich noch gut :p

ok also meins du sowas in der art?

Code:
    public  void erzeuge()
    {
    	synchronized(kunden)
    	{
    		String s = "Kunde "+ (int) (Math.random()*100);
    		System.out.println(s + " erzeugt!");
    		this.kunden.add(s);
    		this.notify();
    	}
    }

****

werd das mal umstellen und testen ^^
 
ah vielen dank, jetz klappts :) dann wollnwa uns ma an die erweiterung machen xd

wie läuft das denn ganz genau ab wenn viele "Verbraucher" da wären? das notify macht automatisch eine "zufallswahl" richtig?
 
Zuletzt bearbeitet:
Zurück