Foliensatz 2
Short Description
Download Foliensatz 2...
Description
Monitore Anwendungsbeispiele Monitore in Java
¨ Ubersicht 1
Monitore Einf¨ uhrung Condition Variables Condition Expressions
2
Einige Anwendungsbeispiele mit Monitoren Readers&Writers Philosophen Sleeping Barber Barrier
3
Monitore in Java
Aktuelle Themen zu Informatik der Systeme:
Nebenl¨ aufige Programmierung: Praxis und Semantik Programmierprimitiven (2)
WS 2011/12 Stand der Folien: 6. Dezember 2011
TIDS – Programmierprimitiven (2) – WS 2011/12 – D. Sabel
1 Monitore Anwendungsbeispiele Monitore in Java
Einf¨ uhrung Condition Variables Condition Expressions
Monitore Anwendungsbeispiele Monitore in Java
Vor- und Nachteile von Semaphoren
2/50
Einf¨ uhrung Condition Variables Condition Expressions
Vor- und Nachteile von Semaphoren (2)
Nachteile Vorteile
Explizites Setzen und Entfernen der Locks
Viele Probleme der nebenl¨aufigen Programmieren lassen sich mit Semaphoren l¨ osen
Fehleranf¨allig: Vergisst der Programmierer einen signal-Aufruf kann ein Deadlock auftreten
In vielen Programmiersprachen sind Semaphoren implementiert
TIDS – Programmierprimitiven (2) – WS 2011/12 – D. Sabel
Vergisst der Programmieren einen wait-Aufruf kann der exklusive Zugriff verletzt werden
3/50
TIDS – Programmierprimitiven (2) – WS 2011/12 – D. Sabel
4/50
Monitore Anwendungsbeispiele Monitore in Java
Einf¨ uhrung Condition Variables Condition Expressions
Monitore Anwendungsbeispiele Monitore in Java
Monitore
Einf¨ uhrung Condition Variables Condition Expressions
Monitore (2) Kapselung von Daten und Methoden
classmonitor Konto { int Saldo; int Kontonummer; int KundenId
Monitore versuchen die Schw¨achen der Semaphoren zu beheben Erm¨oglichen strukturierte Programmierung
Kein direkter Zugriff auf Attribute Zugriff nur u ¨ber die Methoden
abheben(int x) { Saldo := Saldo - x; }
Daten und Zugriff auf die Daten werden in einem Monitor gekapselt
Nur ein Prozess kann zu einer Zeit im Monitor sein
passen zu dem Modell der Objektorientierung
D.h. nur eine Methode von einem Prozess zu einer Zeit am Ausf¨ uhren
zubuchen(int x) { Saldo := Saldo + x; }
Andere Prozesse werden blockiert
}
TIDS – Programmierprimitiven (2) – WS 2011/12 – D. Sabel
Monitore Anwendungsbeispiele Monitore in Java
5/50
Einf¨ uhrung Condition Variables Condition Expressions
Monitore Anwendungsbeispiele Monitore in Java
Monitore (3)
6/50
Einf¨ uhrung Condition Variables Condition Expressions
Mutual Exclusion mit Monitor monitor Mutex { ... Variablen des kritischen Abschnitts ... inKritischenAbschnitt(. . . ) { Kritischer Abschnitt; } }
Wartende Prozesse entweder in FIFO-Schlange oder Menge, d.h. keine Starvation-Freiheit
Prozess i: loop forever (1) Restlicher Code (2) Mutex.inKritischenAbschnitt() end loop
H¨angt von der Implementierung ab
TIDS – Programmierprimitiven (2) – WS 2011/12 – D. Sabel
TIDS – Programmierprimitiven (2) – WS 2011/12 – D. Sabel
7/50
TIDS – Programmierprimitiven (2) – WS 2011/12 – D. Sabel
8/50
Monitore Anwendungsbeispiele Monitore in Java
Einf¨ uhrung Condition Variables Condition Expressions
Monitore Anwendungsbeispiele Monitore in Java
Vor- und Nachteile bisher
Einf¨ uhrung Condition Variables Condition Expressions
Erweiterung der Monitordefinition
Vorteil gegen¨ uber Semaphoren Setzen / Entfernen des Locks geschieht implizit Bisherige Monitordefinition zu schwach (im Vergleich mit Semaphoren)
Nachteil gegen¨ uber Semaphoren Viele Probleme ben¨ otigen explizites Blockieren von Prozessen
Deshalb: Erweiterung um Condition Variables oder Condition Expressions
Beispiele: Bounded Buffer: Erzeuger muss blockiert werden, wenn Buffer voll ist und Verbraucher muss blockiert werden, wenn Buffer leer ist Readers- und Writer: Es sollen mehrere Leser-Prozesse erlaubt sein, und Writer-Prozesse m¨ ussen blockiert werden solange gelesen wird usw. Bei Readers- und Writers: Lesende Prozesse d¨ urfen beim Lesen nicht im Monitor verbleiben, sonst kann immer nur ein Prozess lesen!
Zwei verschiedene Ans¨atze, beide kommen in Programmiersprachen vor Im folgenden: erst Condition Variables dann (kurz) Condition Expressions
TIDS – Programmierprimitiven (2) – WS 2011/12 – D. Sabel
Monitore Anwendungsbeispiele Monitore in Java
9/50
Einf¨ uhrung Condition Variables Condition Expressions
Condition Variables
TIDS – Programmierprimitiven (2) – WS 2011/12 – D. Sabel
Monitore Anwendungsbeispiele Monitore in Java
10/50
Einf¨ uhrung Condition Variables Condition Expressions
Condition Variables (2) Simulation einer Semaphore mit einem Monitor monitor Semaphore { int s := k; condition notZero;
FIFO-Queue (meistens) mit Operationen Name der Condition Variables wird meistens so gew¨ahlt, dass er die wahr werdene Bedingung erl¨autert, aber
wait() { if s = 0 then waitC(notZero) s := s - 1 }
die Bedingung wird nicht vom Laufzeitsystem gepr¨ uft. Es ist nur ein Name Operationen f¨ ur Condition Variable cond: waitC(cond) signalC(cond) manchmal: empty(cond)
signal() { s := s + 1 signalC(notZero) }
Achtung: Semantik verschieden von signal und wait bei Semaphoren! } TIDS – Programmierprimitiven (2) – WS 2011/12 – D. Sabel
11/50
TIDS – Programmierprimitiven (2) – WS 2011/12 – D. Sabel
12/50
Monitore Anwendungsbeispiele Monitore in Java
Einf¨ uhrung Condition Variables Condition Expressions
Semantik von Condition Variables
Monitore Anwendungsbeispiele Monitore in Java
Einf¨ uhrung Condition Variables Condition Expressions
Semantik von Condition Variables (2) Semantik von signalC
Sei P der aufrufende Prozess, cond eine Condition Variable im Monitor monitor. Erinnerung: cond ist eine FIFO-Queue (Liste) Sei lock der implizite Lock des Monitors (Lock zur Entry-Queue) Semantik von waitC waitC(cond) { cond := append(cond,P); //Prozess wird zur Queue hinzugef¨ ugt P.state := blocked; //Prozess blockiert monitor.lock := release; // Monitor-Lock wird freigegeben }
TIDS – Programmierprimitiven (2) – WS 2011/12 – D. Sabel
Monitore Anwendungsbeispiele Monitore in Java
13/50
Einf¨ uhrung Condition Variables Condition Expressions
Semantik von Condition Variables (3)
signalC(cond) { if cond 6= empty then Q := head(cond); //Erster Prozess der Queue cond := tail(cond); //wird aus Queue entfernt Q.state := ready; //und entblockiert } Achtung: Die Semantik so ist noch unterspezifiziert: Anscheinlich: Aufrufender Prozess und entblockierter Prozess gleichzeitig im Monitor Kl¨arung sp¨ater, Annahme erstmal: Aufrufender Prozess verl¨asst Monitor
TIDS – Programmierprimitiven (2) – WS 2011/12 – D. Sabel
Monitore Anwendungsbeispiele Monitore in Java
14/50
Einf¨ uhrung Condition Variables Condition Expressions
Semaphorensimulation – nochmal monitor Semaphore { int s := k; condition notZero;
Sei P der aufrufende Prozess, cond eine Condition Variable im Monitor monitor.
wait() { if s = 0 then waitC(notZero) s := s - 1 }
Erinnerung: cond ist eine FIFO-Queue (Liste) Sei lock der implizite Lock des Monitors (Lock zur Entry-Queue) Semantik von empty empty(cond) { return(cond = empty); }
signal() { s := s + 1 signalC(notZero) } }
TIDS – Programmierprimitiven (2) – WS 2011/12 – D. Sabel
15/50
TIDS – Programmierprimitiven (2) – WS 2011/12 – D. Sabel
16/50
Monitore Anwendungsbeispiele Monitore in Java
Einf¨ uhrung Condition Variables Condition Expressions
Vergleich wait, signal, waitC, signalC
Semaphoren Sem
Monitore Anwendungsbeispiele Monitore in Java
Einf¨ uhrung Condition Variables Condition Expressions
Erzeuger / Verbraucher mit Monitor
Monitore (Condition Variable cond)
wait(Sem) kann zum Blockieren f¨ uhren, muss aber nicht
waitC(cond) blockiert den Prozess stets
signal(Sem) hat stets einen Effekt: Entblockieren eines Prozesses oder Erh¨ohen von Sem.V
signalC(cond) kann effektlos sein: Entweder Prozess in cond wird entblockiert, oder effektlos, wenn cond leer ist
monitor BoundedBuffer { bufferType buffer := empty; condition notEmpty; condition notFull; Code des Erzeugers: produce(v) { if length(buffer) = N then waitC(notFull); buffer := append(v,buffer); signalC(notEmpty); }
loop forever (1) erzeuge e (2) BoundedBuffer.produce(e) end loop Code des Verbrauchers:
consume() { if length(buffer) = 0 then waitC(notEmpty) w := head(buffer); buffer := tail(buffer); signalC(notFull) return(w); }
loop forever (1) e := BoundedBuffer.consume(); (2) verbrauche e; end loop
} TIDS – Programmierprimitiven (2) – WS 2011/12 – D. Sabel
Monitore Anwendungsbeispiele Monitore in Java
17/50
Einf¨ uhrung Condition Variables Condition Expressions
Genauere Modellierung von Monitoren
TIDS – Programmierprimitiven (2) – WS 2011/12 – D. Sabel
Monitore Anwendungsbeispiele Monitore in Java
18/50
Einf¨ uhrung Condition Variables Condition Expressions
Monitor-Modellierung mit drei Queues f¨ur die Condition Variable
Erinnerung: Beim Durchf¨ uhren von signalC ist nicht eindeutig, wer den Monitor-Lock anschließend haben soll. Es gibt verschiedene Varianten Wenn gewecketer Prozess weiterrechnen darf: Wo wartet der signalisierende Prozess? Deshalb genauere Modellierung: Condition Variable besteht nicht aus einer Queue, sondern aus drei Queues : Condition-Queue wait-Queue signal-Queue
TIDS – Programmierprimitiven (2) – WS 2011/12 – D. Sabel
19/50
TIDS – Programmierprimitiven (2) – WS 2011/12 – D. Sabel
20/50
Monitore Anwendungsbeispiele Monitore in Java
Einf¨ uhrung Condition Variables Condition Expressions
Semantik der Queues
Monitore Anwendungsbeispiele Monitore in Java
Einf¨ uhrung Condition Variables Condition Expressions
Priorit¨aten f¨ur die Queues
Condition-Queues: Dort warten die mit waitC blockierten Prozesse an einem Lock f¨ ur die Condition Variable Wait-Queue: Wird ein signalC ausgef¨ uhrt, so wird der erste wartende Prozess der Condition-Queue in die Wait-Queue eingef¨ ugt. Er wartet nun am Monitor-Lock Signal-Queue: Der Prozess der signalC ausf¨ uhrt, wird in die Signal-Queue eingereiht, falls er einen Prozess der Condition-Queue entblockiert hat. Auch die Signal-Queue wird vom Monitor-Lock verwaltet. Entry-Queue: Wartende Prozesse, die den Monitor betreten m¨ ochten
Problem Welche der drei Queues am Monitor-Lock hat Vorrang vor den anderen? Je nach Implementierung gibt es verschiedene Strategien Wir schreiben E, W, S f¨ ur die Priorit¨aten der Entry-, Waitund Signal-Queue
Problem Welche der drei Queues am Monitor-Lock hat Vorrang vor den anderen? TIDS – Programmierprimitiven (2) – WS 2011/12 – D. Sabel
Monitore Anwendungsbeispiele Monitore in Java
21/50
Einf¨ uhrung Condition Variables Condition Expressions
Priorit¨aten f¨ur die Queues (2)
TIDS – Programmierprimitiven (2) – WS 2011/12 – D. Sabel
Monitore Anwendungsbeispiele Monitore in Java
22/50
Einf¨ uhrung Condition Variables Condition Expressions
Monitore mit Condition Expressions
13 M¨ oglichkeiten 1 2 3 4 5 6 7 8 9 10 11 12 13
E=W =S E=W S E>S>W E>W >S
Anstelle von Condition Variablen:
Wait and Notify Signal and Wait
Es d¨ urfen echte Boolesche Ausdr¨ ucke verwendet werden bei waitCE (wir schreiben waitCE statt waitC)
Signal and Continue Klassische Definition nicht sinnvoll nicht sinnvoll nicht sinnvoll nicht sinnvoll nicht sinnvoll nicht sinnvoll nicht sinnvoll
TIDS – Programmierprimitiven (2) – WS 2011/12 – D. Sabel
Die Operation signalC gibt es nicht Das Laufzeitsystem pr¨ uft, ob die Ausdr¨ ucke wahr werden und entblockiert dann automatisch.
23/50
TIDS – Programmierprimitiven (2) – WS 2011/12 – D. Sabel
24/50
Monitore Anwendungsbeispiele Monitore in Java
Einf¨ uhrung Condition Variables Condition Expressions
Monitore Anwendungsbeispiele Monitore in Java
Readers&Writers Philosophen Sleeping Barber Barrier
Erzeuger / Verbraucher mit Condition Expressions monitor BoundedBuffer { bufferType buffer := empty; constant length := N ;
Im Folgenden:
Code des Erzeugers:
produce(v) { waitCE(length(buffer) < N ); // Puffer voll? buffer := append(v,buffer); }
Einige der bekannten Anwendungsbeispiele kodiert mit Monitoren
loop forever (1) erzeuge e (2) BoundedBuffer.produce(e) end loop
Wir benutzen Monitore mit Condition Variables Mit der klassischen Definition E < S < W (Signal and Urgent Wait)
Code des Verbrauchers: consume() { waitCE(length(buffer) > 0); // Puffer leer? w := head(buffer); buffer := tail(buffer); return(w); }
loop forever (1) e := BoundedBuffer.consume(); (2) verbrauche e; end loop
}
TIDS – Programmierprimitiven (2) – WS 2011/12 – D. Sabel
Monitore Anwendungsbeispiele Monitore in Java
25/50
Readers&Writers Philosophen Sleeping Barber Barrier
Readers & Writers mit Monitoren
Monitore Anwendungsbeispiele Monitore in Java
26/50
Readers&Writers Philosophen Sleeping Barber Barrier
Readers & Writers mit Monitoren (2) ...
monitor RW { int countR, countW := 0; condition okToWrite, okToRead;
startWrite() { if countR 6= 0 or countW 6= 0 then waitC(okToWrite); countW := 1;}
startRead() { if countW 6= 0 or not(empty(okToWrite)) then waitC(okToRead); countR := countR + 1; signalC(okToRead);}
endWrite() { countW := 0; if empty(okToRead) then signalC(okToWrite); else signalC(okToRead);}
endRead() { countR := countR - 1; if countR = 0 then signalC(okToWrite);}
Code des Readers: (1) (2) (3)
...}
TIDS – Programmierprimitiven (2) – WS 2011/12 – D. Sabel
TIDS – Programmierprimitiven (2) – WS 2011/12 – D. Sabel
27/50
RW.startRead(); Lese; RW.endRead();
TIDS – Programmierprimitiven (2) – WS 2011/12 – D. Sabel
Code des Writers: (1) (2) (3)
RW.startWrite(); Schreibe; RW.endWrite(); 28/50
Monitore Anwendungsbeispiele Monitore in Java
Readers&Writers Philosophen Sleeping Barber Barrier
Speisende Philosophen mit Monitoren
Monitore Anwendungsbeispiele Monitore in Java
Readers&Writers Philosophen Sleeping Barber Barrier
Speisende Philosophen mit Monitoren (2)
Modellierung nicht mit Semaphoren Gabeln werden nur implizit benutzt Stattdessen: F¨ ur jeden Philosoph wird notiert, wieviele Gabeln vor ihm liegen (0,1 oder 2) Philosoph isst nur dann, wenn er zwei Gabeln hat Modifikation der Anzahl Gabeln: Philosoph i selbst linker oder rechter Nachbar von Philosoph i
TIDS – Programmierprimitiven (2) – WS 2011/12 – D. Sabel
Monitore Anwendungsbeispiele Monitore in Java
29/50
Readers&Writers Philosophen Sleeping Barber Barrier
Speisende Philosophen mit Monitoren (3)
TIDS – Programmierprimitiven (2) – WS 2011/12 – D. Sabel
Monitore Anwendungsbeispiele Monitore in Java
30/50
Readers&Writers Philosophen Sleeping Barber Barrier
Speisende Philosophen mit Monitoren (3)
monitor Forks { constant anzahlPhil := N ; int array [0,. . . ,anzahlPhil] fork := [2,. . . ,2]; condition array [0,. . . , anzahlPhil] okToEat;
Philosoph i: loop forever (1) Denke; (2) Forks.takeForks(i); (3) Esse; (4) Forks.releaseForks(i); end loop
takeForks(i) { if fork[i] 6= 2 then waitC(okToEat[i]); fork[i+1] := fork[i+1]-1; fork[i-1] := fork[i-1]-1;} releaseForks(i) { fork[i+1] := fork[i+1]+1; fork[i-1] := fork[i-1]+1;}
Eigenschaften L¨osung ist Deadlock-frei aber nicht Starvation-frei!
if fork[i+1] = 2 then signalC(okToEat[i+1]); if fork[i-1] = 2 then signalC(okToEat[i-1]);} } TIDS – Programmierprimitiven (2) – WS 2011/12 – D. Sabel
31/50
TIDS – Programmierprimitiven (2) – WS 2011/12 – D. Sabel
32/50
Monitore Anwendungsbeispiele Monitore in Java
Readers&Writers Philosophen Sleeping Barber Barrier
Sleeping Barber mit Monitoren
Monitore Anwendungsbeispiele Monitore in Java
Readers&Writers Philosophen Sleeping Barber Barrier
Sleeping Barber mit Monitoren (2) monitor Barbershop { int wartend:= 0; condition kundenVorhanden; condition friseurBereit; condition ladenVerlassen; // Methoden f¨ ur den Friseur nehmeKunden() { if wartend = 0 then waitC(kundenVorhanden); wartend := wartend - 1; signalC(friseurBereit)} beendeKunden() { waitC(ladenVerlassen)} ...
TIDS – Programmierprimitiven (2) – WS 2011/12 – D. Sabel
Monitore Anwendungsbeispiele Monitore in Java
33/50
Readers&Writers Philosophen Sleeping Barber Barrier
Sleeping Barber mit Monitoren (3) ... // Methoden f¨ ur den Kunden bekommeFrisur() { if wartend < N then wartend := wartend + 1; signalC(kundenVorhanden) waitC(friseurBereit) return(True); else return(False);} verlasseLaden(){ signalC(ladenVerlassen)} }
TIDS – Programmierprimitiven (2) – WS 2011/12 – D. Sabel
TIDS – Programmierprimitiven (2) – WS 2011/12 – D. Sabel
Monitore Anwendungsbeispiele Monitore in Java
34/50
Readers&Writers Philosophen Sleeping Barber Barrier
Barrier mit Monitor
Friseur: loop forever Barbershop.nehmeKunden(); Frisiere; Barbershop.beendeKunden() Kunde if Barbershop.bekommeFrisur() then erhalte Frisur; verlasseLaden();
35/50
TIDS – Programmierprimitiven (2) – WS 2011/12 – D. Sabel
36/50
Monitore Anwendungsbeispiele Monitore in Java
Readers&Writers Philosophen Sleeping Barber Barrier
Barrier mit Monitor (2)
Monitore in Java
monitor Barrier { int angekommen:= 0; int maxProzesse := N ; condition alleAngekommen; Prozess i: barrier (){ loop forever angekommen := angekommen + 1; Code vor dem Barrier if angekommen < maxProzesse then Barrier.barrier() waitC(alleAngekommen); Code nach dem Barrier else end loop angekommen := 0; signalAllC(alleAngekommen); } } signalAllC: neue Operation: Alle wartenden Prozesse werden entblockiert TIDS – Programmierprimitiven (2) – WS 2011/12 – D. Sabel
Monitore Anwendungsbeispiele Monitore in Java
37/50
Monitore Anwendungsbeispiele Monitore in Java
Keine expliziten Monitore, aber synchronized Methoden Idee dabei: Jedes Objekt hat eine Lock-Variable Werden Methoden mit synchronized modifiziert, dann ist der exklusive Zugriff auf das Objekt u ¨ber diese Methode sichergestellt
TIDS – Programmierprimitiven (2) – WS 2011/12 – D. Sabel
38/50
Monitore Anwendungsbeispiele Monitore in Java
Monitore in Java (2)
Monitore in Java (3)
Erlaubt: class MonitoredClass { . . . Attribute . . .
class MonitoredClass { . . . Attribute . . . synchronized method1 {. . . }
synchronized method1 {. . . } synchronized method2 {. . . } method2 {. . . } Nur ein Thread gleichzeitig f¨ uhrt Methode aus method2 ist nicht synchronisiert.
wenn method1 im Rumpf method2 aufruft, dann wird der Lock beibehalten.
TIDS – Programmierprimitiven (2) – WS 2011/12 – D. Sabel
method2 kann jederzeit aufgerufen werden
39/50
TIDS – Programmierprimitiven (2) – WS 2011/12 – D. Sabel
40/50
Monitore Anwendungsbeispiele Monitore in Java
Monitore Anwendungsbeispiele Monitore in Java
Monitore in Java (4)
Monitore in Java (5)
Statt Condition Variables Operationen wait, notify, notifyAll Nur eine Queue pro Objekt (zwischen verschiedenen Condition Variablen kann nicht unterschieden werden)
Ein entblockierter Prozess kann m¨oglicherweise erst dann den Lock erhalten, wenn Bedingung wieder falsch!
wait(): Thread wartet an der Queue des Objekts
L¨osung: Bedingung erneut pr¨ ufen!
notify(): Ein wartender Thread wird entblockiert, aber: Aufrufender Prozess beh¨alt Lock!
while (not Bedingung) wait();
notifyAll(): Alle wartende Threads werden entblockiert, aber: Aufrufender Prozess beh¨alt Lock! Wartende Threads haben gleiche Priorit¨at wie neue! Entspricht W = E < S
TIDS – Programmierprimitiven (2) – WS 2011/12 – D. Sabel
41/50
Monitore Anwendungsbeispiele Monitore in Java
TIDS – Programmierprimitiven (2) – WS 2011/12 – D. Sabel
42/50
Monitore Anwendungsbeispiele Monitore in Java
Monitore in Java (6)
Monitore in Java (7)
Wie programmiert man Algorithmen mit mehreren Condition Variablen? Gew¨ unscht, aber geht nicht: synchronized method1() { if (x==0) while (x==0) wait(); }
synchronized kann nicht nur f¨ ur Methoden, sondern f¨ ur beliebige Codebl¨ocke benutzt werden. Angabe des Objekts notwendig Object obj = new Object();
synchronized method2() { if (y==0) while (y==0) wait(); }
synchronized (obj) { Kritischer Abschnitt }
... if some condition notify(auf x 6= 0 wartende Prozess)notifyAll(); else notify(auf y 6= 0 wartende Prozess)notifyAll(); TIDS – Programmierprimitiven (2) – WS 2011/12 – D. Sabel
43/50
TIDS – Programmierprimitiven (2) – WS 2011/12 – D. Sabel
44/50
Monitore Anwendungsbeispiele Monitore in Java
Monitore Anwendungsbeispiele Monitore in Java
Beispiele in Java: Producer / Consumer (1)
Beispiele in Java: Producer / Consumer (2) synchronized void produce(V elem) { while (length == size) { try {wait();} catch (InterruptedException e) {}; } buffer.add(elem); length++; notifyAll(); }
import java.util.LinkedList; // Die Klasse fuer den Buffer class BBufferMon { private LinkedList buffer = new LinkedList(); private Integer length; // Fuellstand private Integer size; // maximale Gr"oesse
synchronized public V consume() { while (length == 0) { try {wait();} catch (InterruptedException e) {}; } V e = buffer.removeFirst(); length--; notifyAll(); return e; }
BBufferMon(Integer n){ size = n; length = 0; }
} TIDS – Programmierprimitiven (2) – WS 2011/12 – D. Sabel
45/50
Monitore Anwendungsbeispiele Monitore in Java
TIDS – Programmierprimitiven (2) – WS 2011/12 – D. Sabel
46/50
Monitore Anwendungsbeispiele Monitore in Java
Beispiele in Java: Producer / Consumer (3)
Beispiele in Java: Producer / Consumer (4) Main-Klasse und Methode:
Klassen f¨ ur Erzeuger und Verbraucher: class Producer extends Thread { BBufferMon buff; Integer number; Producer(BBufferMon b, Integer i) { buff = b; number = i;} public void run() { for (int i = 1; i
View more...
Comments