Das Erzeuger/Verbraucher-Problem in Java
|
Hinweise zur Benutzung der Demo
|
Die Demo zeigt die korrekte Lösung des
Erzeuger/Verbraucher-Problems in Java. Um Verklemmungen zu vermeiden, muß mit
notifyAll() signalisiert werden.
Um den direkten Vergleich mit der
falschen Lösung
zu ermöglichen, hat der Puffer auch hier nur einen Pufferplatz.
- Hinweis: Falls Sie oben kein Java-Applet sehen, unterstützt Ihr Browser keine Java-Applets mehr.
In diesem Fall gehen Sie bitte wie folgt vor:
- Laden Sie sich die Zip-Datei mit den Demos herunter.
- Entpacken Sie die Datei.
- Nun können Sie das Applet mit dem Kommando appletviewer <html-Datei> ausführen.
- Im linken Teil sind dargestellt:
- Der Zustand des (von Java realisierten) Monitors, bestehend aus:
- Dem Synchronized-Lock, d.h. der (internen) Sperrvariable,
die dem Java Objekt zugeordnet ist. Die Farben bedeuten:
- grün: Monitor ist frei (Wert = 1)
- gelb: Monitor ist belegt, kein wartender Thread (Wert = 0)
- rot: Monitor ist belegt, Threads warten (Wert < 0)
- Der (einzigen!) Bedingungsvariable des (von Java realisierten) des Monitors. Die Farben bedeuten:
- grün: kein wartender Thread
- orange: mindestens ein Thread wartet an der Bedingungsvariable
- Den anderen Monitor-Variablen, hier dem Zähler der belegten Pufferplätze.
- Der Puffer mit einem Pufferplatz. Ein blauer Hintergrund zeigt an, daß der Pufferplatz belegt ist.
- Ein Feld zum globalen Einzelschrittbetrieb. Bei jedem
Drücken des 'Einzelschritt'-Knopfes führt ein
rechenbereiter Thread die nächste Codezeile aus.
Über die Combo-Box 'Strategie' kann die Auswahlstrategie
festgelegt werden:
- Random: zufällig
- RR, Round Robin: die Threads werden reihum
ausgewählt; ein Thread, der einen Schritt ausgeführt
hat und rechenbereit ist, stellt sich hinten wieder an.
- FIFO: ein Thread wird solange ausgeführt, bis er
blockiert. Erst dann kommt der nächste Thread.
- Prio: die Threads erhalten eine Priorität, die von
links oben nach rechts unten abnimmt. Es wird immer
der rechenbereite Thread mit der höchsten Priorität
ausgeführt.
- rev. Prio: die Threads erhalten eine Priorität, die von
links oben nach rechts unten zunimmt. Es wird immer
der rechenbereite Thread mit der höchsten Priorität
ausgeführt.
- Im
rechten Teil sind die beteiligten Threads (bzw. Prozesse) mit ihrem
Quellcode dargestellt.
- Die blaugrüne Markierung zeigt die nächste auszuführende Codezeile an.
- Eine rote Markierung bedeutet, daß der Thread in dieser Zeile
blockiert ist, weil der auf den (Wieder-)Eintritt in den Monitor wartet.
- Eine orange Markierung zeigt an, daß der Thread an der Bedingungsvariable wartet.
Wenn der 'Einzelschritt'-Knopf gedrückt wird, führt der
Thread die nächste Codezeile aus.
Dargestellt ist für jeden Thread nur die jeweilige Methode, die er ausführt. Die
Methode wird zyklisch ausgeführt, d.h. nach dem Verlassen tritt der
Thread im nächsten Schritt wieder in die Methode ein.
- Zum Zurücksetzen der Demo drücken Sie den 'Reload'-Knopf Ihres
Browsers.