Foliensatz 2

January 30, 2018 | Author: Anonymous | Category: Ingenieurwissenschaften, Informatik, Java
Share Embed Donate


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

Copyright � 2017 NANOPDF Inc.
SUPPORT NANOPDF