Monitor: wait() und notify()

Luk10

Top Contributor
Grüße,

In der Schule lernen wir gerade das Monitor-Prinzip zur sychornisation von Prozessen.

Wir verwenden zur Veranschaulichung folgendes "Modell":

> Klasse Schreiber, Leser [extends Thread]
> Klasse Puffer

Beide Klassen, Schreiber und Leser wollen auf eine Variable im Puffer zugreifen und diese ändern (Methoden in Puffer: schreibe() und lese(), beide sychronized).

Da ich leider den Code aus dem Unterricht nicht da habe, bräuchte ich jemanden der mir einen gute Erklärung linkt, oder mir hier gibt zu folgendem:

Wie werden die Threads im Puffer registriert bzw gespeichert? Was genau machen wait() und notify() und wann muss ich sie aufrufen bzw wie werden sie verwendet?

Danke,
-Luk10-
 

Lybrial

Bekanntes Mitglied
Hallo Luk10,

also wait () setzt du ein, wenn du einem Thread sagen möchtest, dass deine Ressource gerade von einem anderen Thread benutzt wird und er deswegen warten soll.

Notify () benutzt du, um dem Thread widerrum mitzuteilen, dass die Ressource nun wieder fregegeben ist und genutzt werden kann.

Dabei gilt das Notify () dem Thread, der als erstes wait () ausgeführt hat.#

Es gibt eine weitere Methode, notifyAll (), diese sagt allen Threads das die Ressource wieder frei ist, nicht nur dem einen.
 

xehpuk

Top Contributor
Hey,

meines Erachtens sind alle Ausführungen meines Vorposters falsch.

Wenn Englisch kein Problem ist, würde ich einfach mal ins offizielle Tutorial reinschauen: Lesson: Concurrency (The Java™ Tutorials > Essential Classes)
Ansonsten kann ich die Kolumne "Effective Java" empfehlen: AngelikaLanger.com - Effective Java - A column by Angelika Langer & Klaus Kreft - Angelika Langer Training/Consulting
Dort die Einträge zu "Concurrency".

Mit Nebenläufigkeit muss man sich schon eine Weile beschäftigen. Falscher Umgang mit Threads ist eine häufige Fehlerursache.
 

Luk10

Top Contributor
Danke für die Antworten & Links ...

Leider hilft mir beides nicht wirklich, weil das viel zu umfangreich ...
Rufe ich wait() und notify() auf die Threads auf? Oder auf den Puffer?

Wie wird geregelt, dass die Threads nacheinander dran kommen?

Danke,
Luk10
 

Lybrial

Bekanntes Mitglied
Pseudo-Code:

Java:
public synchronized void startWriting ()
{
    if (anderer Thread greif auf Puffer zu)
    {
        wait ();
    }
    else
    {
        // schreibe in den Puffer
    }
}

public synchronized void finishedWriting ()
{
    // thread ist fertig mit schreiben
    notify ();
}
 
Zuletzt bearbeitet:

Lybrial

Bekanntes Mitglied
Dann werde ich mal etwas genauer :D

Also du hast eine Klasse die den Zugriff auf eine Daten-Ressource Steuert.
Wir nehmen hier einfach mal an, dass du nur mit einem Thread gleichzeitig
auf die Ressource zugreifen kannst, das simuliere ich einfach mal mit einem Counter.

Java:
public class SomeClass 
{	
	private int count = 0;
	
	public synchronized void write (Data aData) throws InterruptedException
        {
		while(currentCarCount >= 1) {
			wait();  
		}
		
                count++;           // count = 1, also kann kein weiter Thread drauf zugreifen
                System.out.println(aData.mId + " Ressource wird genutzt!");
		System.out.println(count);
	}
	
	public synchronized void stopWriting (Data aData) 
        {
                count--;
		System.out.println(aData.mId + " wird nicht mehr genutzt!");
		System.out.println(count);
		
		notifyAll();
	}

}

Java:
public class Data extends Thread 
{	
	private SomeClass someClass;
        private int mId;
	
	public Data(SomeClass someClass, int mId) 
       {
		this.someClass = someClass;
		this.mId = mId;
	}

	public void run() 
       {
		while(!isInterrupted()) 
                {
			try 
                        {
				someClass.write(this);
				sleep(Math.abs(new Random().nextLong() % 2000));
				someClass.stopWriting(this);
				sleep(Math.abs(new Random().nextLong() % 2000));
			}
			catch(InterruptedException e) 
                        {
				interrupt();
			}
		}
	}
}

Java:
public class Test 
{
	public static void main(String[] args) throws InterruptedException
        {
		someClass someClass = new SomeClass ();

                Data d1 = new Data (someClass, 1);
                Data d2 = new Data (someClass, 2);
                Data d3 = new Data (someClass, 3);
		
		d1.start();
		d2.start();
		d3.start();
		
		Thread.sleep(30000); // Das Programm läuft so 30 sekunden lang
		
		d1.interrupt();
		d2.interrupt();
		d3.interrupt();  // dann wirds abgebrochen
	}

}

Keine Garantie auf korrekte Syntax, ich habe das jetzt schnell so ohne es zu Testen direkt hier reingeschrieben ;)
 
Zuletzt bearbeitet:

xehpuk

Top Contributor
wait () setzt du ein, wenn du einem Thread sagen möchtest, dass deine Ressource gerade von einem anderen Thread benutzt wird und er deswegen warten soll.
Woher hast du das denn? Ein Thread kommt erst gar nicht zu einem
Code:
wait()
, wenn bereits ein Thread im synchronisierten Bereich ist, weil eben immer nur höchstens ein Thread im (zum selben Objekt) synchronisierten Bereich sein kann. Ein zweiter Thread würde also vorm
Code:
synchronized
warten müssen.

Dabei gilt das Notify () dem Thread, der als erstes wait () ausgeführt hat.#
Nein, siehe die von dir selbst verlinkte javadoc zu
Code:
notify()
.

Sagen wir mal, es gibt beim Puffer einen Konsumenten(thread) und einen Produzenten(thread). Der Konsument kann nur etwas aus dem Puffer nehmen, wenn dieser nicht leer ist. Ist also dieser leer, wartet dieser. Hat der Produzent nun etwas in den Puffer getan, ist dieser ja nicht mehr leer, also benachrichtigt er im Anschluss den Konsumenten.
Ist der Puffer begrenzt, muss man das Ganze auch noch andersherum betrachten. Ist der Puffer voll, muss der Produzent warten, bis der Konsument etwas herausgenommen hat und diesen im Anschluss benachrichtigt.

Es bietet sich an, die Synchronisierung an dem Puffer vorzunehmen (daraus folgt, dass auch
Code:
wait()
und
Code:
notify()
darauf aufgerufen werden).
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I JFrame / Screen auf zweitem (definiertem) Monitor öffnen Java Basics - Anfänger-Themen 3
B Monitor als Schranke von Threads Java Basics - Anfänger-Themen 20
temi Synchronized(Monitor) Java Basics - Anfänger-Themen 2
R Monitor Refresh-Rate Java Basics - Anfänger-Themen 8
I Print Monitor Java Basics - Anfänger-Themen 0
J auf ausgabe am monitor reagieren Java Basics - Anfänger-Themen 16
I Exception bei Button mit wait() und notifyAll() Java Basics - Anfänger-Themen 3
O Threads - Synchronize(), join(), wait(), notify(), yield() Java Basics - Anfänger-Themen 6
ralfb1105 Frage zu Thread Synchronisation mit wait() und notify() Java Basics - Anfänger-Themen 3
M notify und wait Java Basics - Anfänger-Themen 1
M Threads synchronized und wait Java Basics - Anfänger-Themen 2
D Stack-Objekt - LIFO - wait(); notify(); Java Basics - Anfänger-Themen 0
D Probleme mit wait(), notify() Java Basics - Anfänger-Themen 0
M wait/notify bei Socket Java Basics - Anfänger-Themen 4
BlueFox Greenfoot wait() Java Basics - Anfänger-Themen 10
A wait() problem Java Basics - Anfänger-Themen 3
G wait()-Mehtode Java Basics - Anfänger-Themen 13
S Threads: wait() und notify() Java Basics - Anfänger-Themen 11
T meinThread.wait(); wirft immer Exeption & hat kein Effekt Java Basics - Anfänger-Themen 15
S bin zu blöd für threads - wait, notify, synchronized Java Basics - Anfänger-Themen 11
R wait() in synchronized - Block oder nicht? Java Basics - Anfänger-Themen 4
B Problem: wait() -> notify() Java Basics - Anfänger-Themen 4
M Threads, wait() und notify() Java Basics - Anfänger-Themen 10
G Threads steuern mit wait und notify Java Basics - Anfänger-Themen 2
M wait() sleep() geht nicht wirklich Java Basics - Anfänger-Themen 3
P wait und notify oder wie soll ich es lösen Java Basics - Anfänger-Themen 2
vogella *Gelöst *Im Programm warten (wait()) Java Basics - Anfänger-Themen 2
D Wait und Image Java Basics - Anfänger-Themen 3
U wait Java Basics - Anfänger-Themen 2
O Problem bei der Synchronisierung von Threads (wait&notif Java Basics - Anfänger-Themen 4
C java.util.Timer und wait() oder so was Java Basics - Anfänger-Themen 3
I Threads Multithreading, Producer/Consumer, notify() Java Basics - Anfänger-Themen 6
kilopack15 Verständnisfrage zur Verwendung von notify() bei Threads Java Basics - Anfänger-Themen 2
M Threads notify/notifyAll Philosophen-Problem Java Basics - Anfänger-Themen 14
M Threads notify Java Basics - Anfänger-Themen 6
T Alle Threads .notify() Java Basics - Anfänger-Themen 13
M lock notify synchronisation Java Basics - Anfänger-Themen 8
S Problem mit notify() Java Basics - Anfänger-Themen 4
M Warum kann man dem Thread kein notify senden? Java Basics - Anfänger-Themen 15

Ähnliche Java Themen

Neue Themen


Oben