MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o...

89
Techniken der Programmentwicklung Prof. Dr. Wolfgang Schramm MULTITHREADING 6. Kapitel

Transcript of MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o...

Page 1: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

TechnikenderProgrammentwicklung

Prof.Dr.WolfgangSchramm

MULTITHREADING6.Kapitel

Page 2: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

1

Übersicht

1. ProgrammstrukturierungmitPaketen(packages)

2. Vererbung3. AbstrakteKlassenundInterfaces4. Ausnahmebehandlung5. Datenströme:dieJavaIO-Bibliothek6. Multithreading7. InnereKlassen8. Collections9. Generics10. Reflection

Page 3: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

2

LernzieledesKapitels

¨ Verstehen,wasNebenläufigkeitistundwiesiefunktioniertundinwelchenAnwendungensieeingesetztwird.

¨ DiebeidenwichtigstenKonzeptederNebenläufigkeitkennenlernen.

¨ ImplementierungderNebenläufigkeitinJavakennenlernen.

¨ ZuständevonThreadskennenlernen.¨ Synchronisationsmechanismenfür

Threadskennenlernen.¨ ProblemebeiderSynchronisationvon

Threadserkennenundvermeidenlernen.

¨ EigeneThreadsimplementierenundsynchronisierenkönnen.

¨ Threadsverwaltenkönnen.

2

Page 4: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

3

Literaturempfehlung

¨ NichtnurfürdiesesKapitel- auchdarüberhinaus.

Page 5: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

4

Inhalt

o Nebenläufigkeit/Multithreading:Grundlagen,Begriffe,Einsatz

o Prozessevs.Threadso DieKlasseThreado DasInterfaceRunnableo Synchronisationo VerwaltenvonThreadso DasPaketjava.util.concurrent

Page 6: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

5

Multithreading- Grundlagen

o Nebenläufigkeit: FähigkeiteinesSystems,zweiodermehrVorgängegleichzeitigoderquasi-gleichzeitigausführenzukönnen.

o ADA: ersteProgrammiersprachemitdiedirektindieSpracheeingebettetenparallelenProzessen undMechanismenzurKommunikationundSynchronisation.

o KonventionelleProgrammiersprachen:RealisierungvonNebenläufigkeitaufderBasis vonLibrary-Routinen.

o Java: NebenläufigkeitistdirektindieSpracheintegriert,mitdenerforderlichenHilfsmittelnzumManagementderNebenläufigkeit.

o Thread¤ EigenständigesProgrammfragment,dasparallelzuanderenThreadslaufenkann.¤ ÄhnelteinemProzess,arbeitetaberaufeinerfeinerenEbene.

Page 7: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

6

WannistparalleleProgrammierungsinnvoll?

Ressource Belastung

Hauptspeicherzugriffe Prozessor

Dateioperationen Festplatte

Datenbankzugriffe Server, Netzwerkverbindung

Page 8: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

7

Prozessevs.Threads

o Prozessmodellbasiertauf2unabhängigenKonzepten:¤ BündelungderRessourcen¤ AusführungeinesProgramms

o TrennungderbeidenKonzepte:¤ Prozesse:

n GetrennteAdressräume(getrennterHeap)mitQuelltextundDaten.n WeitereRessourcen:geöffneteDateien,Sockets,Speicher,etc.n Kommunikationübersog.Interprozesskommunikation(IPC)._ Prozessewerdenbenutzt,umRessourcenzusammenzufassen.

¤ Threads(Ausführungsfäden):n GetrennterStack.n KommunikationüberdengemeinsamenSpeicher(Heap).n ThreadslaufeninnerhalbeinesProzesses,habenweniger

VerwaltungsinformationenalsProzesse(sindleichtgewichtiger)._ ThreadssindEinheiten,diefürdieAusführungaufderCPUverwaltet

werden.

Page 9: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

8

Interprozesskommunikation

Betriebssystem Prozess 1

Prozess n

Prozess 2

Speicherbereich 1

Speicherbereich 3

Speicherbereich 2

shared memory

Page 10: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

9

KommunikationzwischenThreads

BetriebssystemProzess 1

Prozess 2

Speicherbereich 1

Speicherbereich 2

Thread 1 Stack 1

Thread 2 Stack 2

Thread 3 Stack 3

Prozess 3

JVM

Heap

Page 11: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

10

ProzessundThreads

Prozess

o Adressraum

o GlobaleVariablen

o GeöffneteDateien

o Kindprozesse

o ZubehandelndeSignale

o SignaleundSignalroutinen

o Threads

Thread 1

• Befehlszähler

• Register

• Stack

• Zustand

Thread n

• Befehlszähler

• Register

• Stack

• Zustand

Page 12: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

11

Prozesse/Threads:Einsatz

o Prozess=InstrumentzurAusführungeineskomplettenProgramms.

o InnerhalbeinesProzesseskönnenmehrereThreadsparallellaufen.

o DerLaufzeit-OverheadzurErzeugungundVerwaltungeinesThreadsist(weilleichtgewichtig)relativgeringundkannindenmeistenProgrammenvernachlässigtwerden.

o EinsatzbereichvonThreads:¤ ThreadserleichternunteranderemdieImplementierunggrafischer

Anwendungen,diedurchSimulationenkomplexerAbläufeoftinhärentnebenläufigsind.

¤ Threadskönnenauchdazuverwendetwerden,dieBedienbarkeit vonDialoganwendungenzuverbessern,indemrechenintensiveAnwendungenimHintergrundablaufen.

Page 13: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

12

ThreadsinJava1/2

o RealisiertdurchdieKlasseThread unddasInterfaceRunnable.

o DerThread-Body (=parallelauszuführenderCode)wirdinFormderüberschriebenenMethoderun zurVerfügunggestellt.

o Kommunikation derThreadsuntereinander:¤ durchZugriffaufdieInstanz- oderKlassenvariablenoder¤ durchAufrufbeliebigerMethoden,dieinnerhalbvonrun sichtbarsind.

o Synchronisation:mittelsMonitoren(s.Betriebssystemtheorie)à KoordinationdesZugriffsaufsog.kritischeAbschnitte(gemeinsambenutzteDaten).

Page 14: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

13

ThreadsinJava2/2

o FunktionenzurVerwaltungvonThreads:¤ ZusammenzufassenvonThreadsinGruppen,¤ PriorisierenvonThreads¤ InformationenüberEigenschaftenvonThreadsbeschaffen.

o DasScheduling kannwahlweiseunterbrechendodernichtunterbrechendimplementiertsein.

DieSprachspezifikationlegtdiesnichtendgültigfest,aberindenmeistenJava-ImplementierungenwirddiesvondenMöglichkeitendesdarunterliegendenBetriebssystemsabhängen.

Page 15: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

14

ManagementvonThreads:Scheduling

o ImplementierungsvariantendesScheduling¤ unterbrechend (preemptive,nativethreads)

n VerwaltungderThreadsdurchdasBetriebssystem:DieZeitscheiben(wielangeeinThreadlaufendarf)werdendurchgesetzt.WenneinThreadseineZeitscheibeaufgebrauchthat,wirderunterbrochenundeinandererThreaddarfweiterarbeiten )oder

¤ nichtunterbrechend (kooperativ,green threading)n DieThreadswerdenvonderVirtuellenMaschineselbstverwaltet.DieThreadsgebensichgegenseitigRechenzeitab.EinThreadläuftsolangebiserselbstderVMmitteilt,dasseinandererThreadlaufensoll.

¤ DieSprachspezifikationlegtnichtfestwelcheVarianteimplementiertwerdensoll,aberindenmeistenJava-ImplementierungenwirddiesvondenMöglichkeitendesdarunterliegendenBetriebssystemsabhängen.

¤ DadaskooperativeModelldeutlichfehleranfälligerist,verwendendieallermeistenVirtuellenMaschinennativeThreads.

Page 16: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

15

DieKlasseThread

o DieKlasseThread istBestandteildesPaketsjava.lango Thread stelltdieBasismethodenzurErzeugung,Kontrolleund

zumBeendenvonThreadszurVerfügung.o DeklarationeinerThread-Klasse:AbleitungeinereigenenKlasse

ausThread undÜberschreibenderMethoderun.o Threadausführen:AufrufsderMethodestartà startendes

ThreadundÜbertragungderweiterenAusführungandieMethoderun.DerAufruferkannparallelzumneuerzeugtenThreadfortfahren.

public class Thread { Auszugpublic void start () { ... }

public static void sleep (int millSeconds) { ... }

public void run () { ... }

...

}

Page 17: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

16

Threads– einfachesBeispiel

class MyThread extends Thread

public void run() {

int i = 0;

while (true) {

System.out.println(i++);

}

}

}

public class ThreadTest {

public static void main(String[] args) {

MyThread t = new MyThread();

t.start();

}

}

Run-Methode der Klasse MyThread

Starten des Thread t der Klasse MyThread

Page 18: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

17

TerminierungvonThreads

o BeendeneinesThreaddadurch,dassdasEndeseinerrun-Methodeerreichtist.

o InmanchenFällenistesjedocherforderlich,denThreadvonaußenabzubrechen:¤ durchAufrufderMethodestop derKlasseThread.¤ durchReaktionaufUnterbrechungsanforderungenimThreadselbst:

n SpeichernundAbfrageneinerUnterbrechungsanforderungineigenenMembervariablen.

n VerwendungvonMethoden(interrupt,etc.)derKlasseThread.

o WasistbeieinemAbbrechenvonaußenzubeachten?

Page 19: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

18

TerminierungeinesThreadmitinterrupt

package threads;public class InterruptTest extends Thread {

private int cnt = 0;

public void run() {while (true) {

if (isInterrupted()) {break;

}printLine(++cnt); // start with cnt = 1

}}

private void printLine(int cnt) {//Zeile ausgebenSystem.out.print(cnt + ": ");for (int i = 0; i < 30; ++i) {

System.out.print(i == cnt % 30 ? "* " : ". ");}System.out.println();//100 ms. Warten – ganz schön langetry {

Thread.sleep(100);} catch (InterruptedException e) {

interrupt();}

}

public static void main(String[] args) {InterruptTest th = new InterruptTest();

//Thread startenth.start();//2 Sekunden wartentry {

Thread.sleep(2000);} catch (InterruptedException e) {}//Thread unterbrechenth.interrupt();

}}1: . * . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2: . . * . . . . . . . . . . . . . . . . . . . . . . . . . . . 3: . . . * . . . . . . . . . . . . . . . . . . . . . . . . . . 4: . . . . * . . . . . . . . . . . . . . . . . . . . . . . . . 5: . . . . . * . . . . . . . . . . . . . . . . . . . . . . . . 6: . . . . . . * . . . . . . . . . . . . . . . . . . . . . . . 7: . . . . . . . * . . . . . . . . . . . . . . . . . . . . . . 8: . . . . . . . . * . . . . . . . . . . . . . . . . . . . . . 9: . . . . . . . . . * . . . . . . . . . . . . . . . . . . . . 10: . . . . . . . . . . * . . . . . . . . . . . . . . . . . . . 11: . . . . . . . . . . . * . . . . . . . . . . . . . . . . . . 12: . . . . . . . . . . . . * . . . . . . . . . . . . . . . . . 13: . . . . . . . . . . . . . * . . . . . . . . . . . . . . . . 14: . . . . . . . . . . . . . . * . . . . . . . . . . . . . . . 15: . . . . . . . . . . . . . . . * . . . . . . . . . . . . . . 16: . . . . . . . . . . . . . . . . * . . . . . . . . . . . . . 17: . . . . . . . . . . . . . . . . . * . . . . . . . . . . . . 18: . . . . . . . . . . . . . . . . . . * . . . . . . . . . . . 19: . . . . . . . . . . . . . . . . . . . * . . . . . . . . . .

• Programm, das in einem separaten Thread ununterbrochen Textzeilen auf dem Bildschirm ausgibt.

• Das Hauptprogramm soll den Thread erzeugen und nach 2 Sekunden durch einen Aufruf von interrupt eine Unterbrechungsanforderung erzeugen.

• Der Thread soll dann die aktuelle Zeile fertig ausgeben und anschließend terminieren.

Page 20: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

20

WeitereMethodenvonThreads1/2

o sleep: statischeMethodederKlasseThreadà deraktiveProzesspausiertfürdieangegebenZeitspanne.

o WährendderWartezeitkannderruhendeThreadvoneinemanderenThreaddurchAufrufvoninterrupt unterbrochen,d.h.gewecktwerden.DieswirddemThreaddurcheineInterruptedException signalisiert,damiterdieUnterbrechungvondernormalenBeendigungdersleep-Methodeunterscheidenkann.

o isAlive gibtimmerdanntrue zurück,wennderThreadgestartet,abernochnichtwiederbeendetwurde.

o DieMethodejoin wartetaufdasEndedesThreads,fürdensieaufgerufenwurde.Sieermöglichtesdamit,einenProzesszustartenund(ähnlicheinemFunktionsaufruf)mitderweiterenAusführungsolangezuwarten,bisderProzessbeendetist.

public static void sleep(long millis)

public static void sleep(long millis, int nanos)

public final boolean isAlive()

public final void join() throws InterruptedException

Page 21: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

21

WeitereMethodenvonThreads2/2

o Thread (Runnable target) ErzeugteinneuesThread-ObjektmiteinemRunnable.

o Runnable target, String name) ErzeugteinneuesThread-ObjektmiteinemRunnable undsetztdenNamen.

o getName() LiefertdenNamendesThreads.DerNamewirdimKonstruktor angegebenodermitsetName()zugewiesen.StandardmäßigistderName»Thread-x«,wobeixeineeindeutigeNummerist.

o setName (String name)

ÄndertdenNamendesThreads.

public Thread (Runnable target)

public Thread (Runnable target, String name)

public final String getName ()

public final void setName (String name)

Page 22: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

22

ZuständeeinesThread– vereinfachteDarstellung

unbekannt

erzeugt

rechnend

schlafend

blockiert

new

start

beendet

run() zu Ende

Scheduler

yieldnotify,interrupt

wait,join

rechenwillig

sleep

später noch genauer

ausgeschlafen,interrupt

Page 23: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

23

Threads- Beispiel

package threads;class CharPrinter extends Thread {

char signal;public CharPrinter (char ch) { signal = ch;}public void run () {

for (int i = 0; i < 20; i++) {System.out.print(signal);int delay = (int)(Math.random()*1000);try {

sleep (delay);} catch (InterruptedException e) { return;}

}}

}

public class ThreadTest {public static void main(String[] args) {

CharPrinter thread1 = new CharPrinter ('.');CharPrinter thread2 = new CharPrinter ('*');thread1.start();thread2.start();System.out.print("+++");

}}

Ausgabe:+++.*.*..*..*.**.**.**.*.***.***..**.*.....

Page 24: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

24

Thread-Objekte

o ThreadssindgewöhnlicheObjektemitbeliebigenMembervariablenundMethoden.

o JederThread(d.h.jedesThread-Objekt)hatseineeigenenlokalenVariablen.

o GreifenmehrereThreadsaufFelderandererObjektezu,danngreifensieaufdieselbenDatenzu.¤ EinThreadkannDatenineinemObjektablegen,diedortvoneinem

anderenThreadabgeholtwerden.¤ KommunikationsmediumfürThreads.¤ DerZugriffaufdiegemeinsamenDatenmussgeordnet(synchronisiert)

werden.

Page 25: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

25

Threads– ZugriffaufgemeinsameDaten1/2

Thread1deposit (500)

void deposit (int b) {

balance = balance + b;

}

void withdraw (int b) {

balance = balance - b;

}

Thread 2

withdraw (500)

balance

Kritische Bereiche

Page 26: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

26

Threads– ZugriffaufgemeinsameDaten2/2

Thread1

...

liesbalance

addiere500

SpeicheredasErgebnisinbalance

...

Thread 2

...

lies balance

subtrahiere 500

Speichere das Ergebnis in balance

....

Welcher Wert steht in balance?

Page 27: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

27

OrganisationderParallelität

o ParallellaufendeThreadskommunizieren(indirekt)überdengemeinsamgenutztenSpeicher(=gemeinsamgenutzteObjekte)

o DiesergemeinsamgenutzteSpeicheristdersog.kritischeBereich.

⇒Koordinationisterforderlich.

o AufdiesenkritischenBereichdürfendieThreadsnurnacheinanderzugreifen– eingleichzeitigerZugriffistausgeschlossen.

o DiekritischenBereichewerdendurchsog.Sperren (locks)geschützt.

o BefindetsicheinThreadimkritischenBereich,sindandereThreadsausgesperrt(mutal exclusion,Mutex).

⇒ Sprachkonstrukte fürdieKoordination.

§ aber:dieseSprachkonstrukte führenselbstwiederzuneuenProblemen.

Page 28: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

28

ProblemederParallelität

o ProblemeinThreadprogrammensindnursehrschwerzureproduzierenunddamitzutestenà tretenhäufigerstimProduktivsystemauf.

o Grundproblem:MenschenkönnennurschlechtinparallelenAbläufendenken.

Page 29: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

29

Threads:Probleme

o Safety Hazards - dasProgrammverhältsichinAnwesenheitmehrererThreadsnichtmehrkorrekt.¤ race condition

o Liveness Hazards - ProblemebeideneneinProgrammmitmehrerenThreadsineinenZustandgerät,beidemeskeineFortschrittemehrmachenkann.¤ Deadlock¤ Livelock¤ Starvation (Aushungern)

o PerformanceHazards - EinProgrammdaszwarkorrektfunktioniert,diePerformanceistjedochtrotzmehrererThreadsschlecht.

Page 30: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

30

SynchronisationvonThreads

o SynchronisationmitMonitoren.o SynchronisationmitEreignissen(wait,notify).o SynchronisationaufdasEndevonanderenThreads(join).

Page 31: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

32

Monitor:Konzept/Eigenschaften

o Monitor (inderInformatik):isteinprogrammiersprachlichesKonzept zurSynchronisationvonZugriffenzeitlichverschränktoderparallellaufenderProzesseoderThreadsaufgemeinsamgenutztenDatenstrukturenoderRessourcen.⇒ InkonsistenteZuständederDatenstrukturenwerdenvermieden.

o Monitor:Objekt(Sperrvariable),dasbestimmteAttributeinsicheinschließt,aufdienurüberbestimmteZugangs-methodenzugegriffenwerdenkann.

o EskannsichimmernureineinzigerThreadimMonitorbefinden.

o Achtung:¤ Monitor≠kritischerBereich¤ MonitorschütztdenkritischenBereich.

Page 32: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

33

Monitor:Funktionsweise

o ZujederZugangsmethodeverwaltetderMonitoreineWarteschlange.

o BetretendesMonitors:durchAusführungeinerZugangsmethodeàMonitoristbesetzt,Sperrewirdgesetzt.

o VerlassendesMonitors:Sperrewirdfreigegeben.o MonitoristbesetztundeinandererThreadwillinden

Monitoreintreten:derThreadwirdindieWarteschlangeeingetragenundmusswarten,bisderKonkurrentdenMonitorverlassenhat.

o MankannkeineAnnahmenüberdieReihenfolgemachen,nachderdieThreadsausderWarteschlangeaktiviertwerden.

o MitMonitorenwerdenkritischeBereichegekapselt.o GuteSystemauslastung⇒ kritischeBereichekleinhalten.

Page 33: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

34

Monitore:RealisierunginJava

o Monitorewerdenrealisiertmitsynchronized-Anweisung.o Durchsynchronized wirdgeschützt

¤ einBlockinnerhalbeinerMethode(synchronized-Anweisung)n DerEintrittineinenMonitorwirddurchdasSetzeneinerSperreaufeinerObjektvariablenerreicht.

¤ einekompletteMethode(synchronized-Modifier)n AlsSperrewirdderthis-Pointerverwendet.

o InJavaistjedesJava-ObjektinderLagealsLockzudienen.Hierzuhateseinspezielles,ausJavanichtlesbares,„Attribut“,dasanzeigt,obderkritischeAbschnittfreiistodernicht.

Page 34: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

35

ZuständeeinesThread– vereinfachteDarstellung

unbekannt

erzeugt

rechnend

schlafend

blockiert

new

start

beendet

run() zu Ende

Scheduler

yieldnotify,interrupt

wait,join

rechenwillig

sleep

später noch genauer

ausgeschlafen,interrupt

Page 35: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

36

Threads- Beispiel

package threads;class CharPrinter extends Thread {

char signal;public CharPrinter (char ch) { signal = ch;}public void run () {

for (int i = 0; i < 20; i++) {System.out.print(signal);int delay = (int)(Math.random()*1000);try {

sleep (delay);} catch (InterruptedException e) { return;}

}}

}

public class ThreadTest {public static void main(String[] args) {

CharPrinter thread1 = new CharPrinter ('.');CharPrinter thread2 = new CharPrinter ('*');thread1.start();thread2.start();System.out.print("+++");

}}

Ausgabe:+++.*.*..*..*.**.**.**.*.***.***..**.*.....

Page 36: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

37

Thread-Objekte

o ThreadssindgewöhnlicheObjektemitbeliebigenMembervariablenundMethoden.

o JederThread(d.h.jedesThread-Objekt)hatseineeigenenlokalenVariablen.

o GreifenmehrereThreadsaufFelderandererObjektezu,danngreifensieaufdieselbenDatenzu.¤ EinThreadkannDatenineinemObjektablegen,diedortvoneinem

anderenThreadabgeholtwerden.¤ KommunikationsmediumfürThreads.¤ DerZugriffaufdiegemeinsamenDatenmussgeordnet(synchronisiert)

werden.

Page 37: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

38

Threads– ZugriffaufgemeinsameDaten1/2

Thread1deposit (500)

void deposit (int b) {

balance = balance + b;

}

void withdraw (int b) {

balance = balance - b;

}

Thread 2

withdraw (500)

balance

Kritische Bereiche

Page 38: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

39

Threads– ZugriffaufgemeinsameDaten2/2

Thread1

...

liesbalance

addiere500

SpeicheredasErgebnisinbalance

...

Thread 2

...

lies balance

subtrahiere 500

Speichere das Ergebnis in balance

....

Welcher Wert steht in balance?

Page 39: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

40

OrganisationderParallelität

o ParallellaufendeThreadskommunizieren(indirekt)überdengemeinsamgenutztenSpeicher(=gemeinsamgenutzteObjekte)

o DiesergemeinsamgenutzteSpeicheristdersog.kritischeBereich.

⇒Koordinationisterforderlich.

o AufdiesenkritischenBereichdürfendieThreadsnurnacheinanderzugreifen– eingleichzeitigerZugriffistausgeschlossen.

o DiekritischenBereichewerdendurchsog.Sperren (locks)geschützt.

o BefindetsicheinThreadimkritischenBereich,sindandereThreadsausgesperrt(mutal exclusion,Mutex).

⇒ Sprachkonstrukte fürdieKoordination.

§ aber:dieseSprachkonstrukte führenselbstwiederzuneuenProblemen.

Page 40: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

41

ProblemederParallelität

o ProblemeinThreadprogrammensindnursehrschwerzureproduzierenunddamitzutestenà tretenhäufigerstimProduktivsystemauf.

o Grundproblem:MenschenkönnennurschlechtinparallelenAbläufendenken.

Page 41: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

42

Threads:Probleme

o Safety Hazards - dasProgrammverhältsichinAnwesenheitmehrererThreadsnichtmehrkorrekt.¤ race condition

o Liveness Hazards - ProblemebeideneneinProgrammmitmehrerenThreadsineinenZustandgerät,beidemeskeineFortschrittemehrmachenkann.¤ Deadlock¤ Livelock¤ Starvation (Aushungern)

o PerformanceHazards - EinProgrammdaszwarkorrektfunktioniert,diePerformanceistjedochtrotzmehrererThreadsschlecht.

Page 42: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

43

SynchronisationvonThreads

o SynchronisationmitMonitoren.o SynchronisationmitEreignissen(wait,notify).o SynchronisationaufdasEndevonanderenThreads(join).

Page 43: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

45

Monitor:Konzept/Eigenschaften

o Monitor (inderInformatik):isteinprogrammiersprachlichesKonzept zurSynchronisationvonZugriffenzeitlichverschränktoderparallellaufenderProzesseoderThreadsaufgemeinsamgenutztenDatenstrukturenoderRessourcen.⇒ InkonsistenteZuständederDatenstrukturenwerdenvermieden.

o Monitor:Objekt(Sperrvariable),dasbestimmteAttributeinsicheinschließt,aufdienurüberbestimmteZugangs-methodenzugegriffenwerdenkann.

o EskannsichimmernureineinzigerThreadimMonitorbefinden.

o Achtung:¤ Monitor≠kritischerBereich¤ MonitorschütztdenkritischenBereich.

Page 44: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

46

Monitor:Funktionsweise

o ZujederZugangsmethodeverwaltetderMonitoreineWarteschlange.

o BetretendesMonitors:durchAusführungeinerZugangsmethodeàMonitoristbesetzt,Sperrewirdgesetzt.

o VerlassendesMonitors:Sperrewirdfreigegeben.o MonitoristbesetztundeinandererThreadwillinden

Monitoreintreten:derThreadwirdindieWarteschlangeeingetragenundmusswarten,bisderKonkurrentdenMonitorverlassenhat.

o MankannkeineAnnahmenüberdieReihenfolgemachen,nachderdieThreadsausderWarteschlangeaktiviertwerden.

o MitMonitorenwerdenkritischeBereichegekapselt.o GuteSystemauslastung⇒ kritischeBereichekleinhalten.

Page 45: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

47

Monitore:RealisierunginJava

o Monitorewerdenrealisiertmitsynchronized-Anweisung.o Durchsynchronized wirdgeschützt

¤ einBlockinnerhalbeinerMethode(synchronized-Anweisung)n DerEintrittineinenMonitorwirddurchdasSetzeneinerSperreaufeinerObjektvariablenerreicht.

¤ einekompletteMethode(synchronized-Modifier)n AlsSperrewirdderthis-Pointerverwendet.

o InJavaistjedesJava-ObjektinderLagealsLockzudienen.Hierzuhateseinspezielles,ausJavanichtlesbares,„Attribut“,dasanzeigt,obderkritischeAbschnittfreiistodernicht.

Page 46: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

48

synchronized– Anweisung:zumSchutzeinesBlocks

class KontoThread extends Thread {

...

Account konto;

public void run () {

...

synchronized (konto) { konto.withdraw(1000); }

...

synchronized (konto) { konto.deposit(500); }

...

}

...

}

Nur wenn 2 Threads dasselbe Konto-Objekt

zugreifen wollen, greift die Sperre.

Page 47: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

49

synchronized– Anwendung:Methode

class Account {

...

int balance;

synchronized void deposit (int b) { balance += b; }

synchronized void withdraw (int b) { balance -= b; }

...

}

void deposit (int b) {

synchronized (this) { balance += b; }

}

void withdraw (int b) {

synchronized (this) { balance -= b; }

}

Sperre von Instanzmethoden mittels

des this-Objekts

Page 48: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

50

Synchronisationsprobleme

Eskannvorkommen,dasssicheinThreadineinemMonitorbefindet,abernichtweiterlaufenkann,bevoreinebestimmteBedingungerfülltist,dieeinandererThreadindemgeschütztenBereichvornimmt.Beispiel:

...

synchronized void withdraw (int b) {

if (balance > b) balance -= b;

else // warte bis Kontostand ausreichend

}

...

DaderaktiveThreaddenMonitorblockiert,kannkeinandererThreaddenMonitorbetretenunddafürsorgen,dassdieBedingungerfülltist⇒ Systemverklemmung(Deadlock),dakeinerderThreadsmehrweiterlaufenkann.

Page 49: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

52

Synchronisationmitwait undnotify 1/2

o Ausgangssituation(Monitoristbesetzt)¤ ZusätzlichzuderSperre,dieeinemObjektzugeordnetist,besitzteinObjektauchnocheineWarteliste:alleThreads,dievomSchedulerunterbrochenwurdenunddaraufwarten,dassderMonitorwiederfreigegebenwird.

¤ EinThread,derdenMonitorbesitzt,kanndiesenwiederfreigeben(z.B.wenneraufdasEintreteneinerbestimmtenBedingungwartenmuss).

o FreigabedesMonitors¤ wait nimmtdiegewährtenSperrendesaktivenThreads(temporär)zurückundstelltdenThread,derdenAufrufvonwait verursachte,indieWartelistedesObjekts.DadurchwirderunterbrochenundimScheduleralsblockiert (d.h.wartend)markiert.

Page 50: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

53

Synchronisationmitwait undnotify 2/2

o Aufwecken eines wartenden Threads¤ notify entfernteinen(beliebigen)ThreadausderWartelistedesObjekts,stelltdie(temporär)aufgehobenenSperrenwiederherundführtihndemnormalenScheduling (Zustandrechenwillig)zu.GibteskeinenwartendenProzess,bleibtnotify wirkungslos.

¤ notifyAll entferntalleThreadsausderWartelistedesObjekts,stelltdie(temporär)aufgehobenenSperrenwiederher,d.h.eswerdenalleandiesemObjektwartendenThreadsinformiertundkönnenweitermachen.

o ZulässignurfürgesperrteObjekte(innerhalbsynchronized-Block).

Page 51: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

54

ZuständeeinesThread- Details

erzeugt rechnend

wartend

blockiert

new startbeendet

run()zu Ende

zuordnen

yield

notify,notifyAll,interrupt

sleep,join mit Frist,wait mit Frist

rechen-willig

befristet wartend

join,wait

synchronized

notify,notifyAll,interrupt,Fristablauf

verdrängen

Ende vonsynchronized

Page 52: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

55

Abläufesteuernmitwait undnotify

o wait undnotify sindfürelementareSynchronisationsaufgaben geeignet.

o EskommtwenigeraufdieKommunikationalsaufdieSteuerungder zeitlichen Abläufe an.

o waità immerineinerSchleifeaufrufen,indermandieBedingungprüft,aufdiederThreadwartet.BeimAufwachendesThreadskannnämlichnichtgarantiertwerden,dassdieseBedingungerfülltist.DerThreadmussdeshalbdieBedingungnochmalsprüfenundsichggf.erneutschlafenlegen.

o wait undnotify dürfennurauseinemsynchronisiertenBereich(Monitor)aufgerufenwerden(wenndasObjektbereitsgesperrtist).WerdensieaußerhalbeinessynchronisiertenBereichsaufgerufenà Ausnahme(IllegalMonitorStateException).

o WährendderWartezeit(vonwait)kanneineUnterbrechungdurcheinenanderenThreadauftreten(InterruptedException):àeinschließenineinetry-Anweisung.

Page 53: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

56

Wannmusssynchronisiertwerden?

o MehrereThreadsgreifenaufeinObjektzu+mindestenseinThreadändertdenZustanddesObjektsè alleMethodendiedenZustanddesObjektslesenoderschreibendzugreifen,müssenmitsynchronized gekennzeichnetwerden.

o Machtmandiesnicht(d.h.mindestenseineMethodeistnichtmitsynchronized gekennzeichnet)è diesesObjektistnichtThread-sicher.

o DieZugriffeüberdienichtsynchronzied-MethodenunterliegenkeinerleiKontrolledurchdenMonitorundkönnenjederzeitzumZugekommenà Safety Hazards.

Page 54: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

57

SynchronisationmitnotifyAll

notifyAll stattnotfiy,wenneinerderfolgendenFällegilto InderWarteschlangebefindensichThreadsmit

unterschiedlichenWartebedingungen.VerwendetmanindiesemFallnotifyà dieGefahr,dassder„falsche“Threadgewecktwird.¤ Beispiel:Erzeuger-Verbraucher-Problem.HiergibtesThreads,die

daraufwarten,dassderPuffergefülltwirdundandereThreads,diedaraufwarten,dassimPufferPlatzist.

o DurchdieVeränderungdesZustandseinesObjektskönnenmehrereThreadsweiterlaufen.¤ Beispiel:Ampel,andermehrereAutoswarten.SchaltetdieAmpelauf

grün,könnenallewartendenAutosweiterfahren.

Page 55: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

58

Einsatzbereichvonwaitundnotify

o Szenarienmitwait()undnotify()sindoftProduzenten-Konsumenten-Beispiele.¤ EinThreadliefertDaten,dieeinandererThreadverwendenmöchte.¤ DaernichtineinerkostspieligenSchleifeaufdieInformationwartensoll,

synchronisierensichdiePartnerübereinbeidenbekanntesObjekt.¤ Erstdann,wennderProduzentseinOKgegebenhat,machtesfürden

DatennutzerSinnweiterzuarbeiten;jetzthaterseinebenötigtenDaten.¤ SowirdkeineunnötigeZeitinWarteschleifenvergeudet,undderProzessor

kanndieübrigeZeitanderenThreadszuteilen.

Page 56: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

59

SynchronisationaufThreadendemitjoin

o join: DeraktuelleThreadwartetaufdasEndedesThreads,fürdenjoin aufgerufenwurde.Þ mankannz.B.einenThreadstartenund(ähnlicheinem

Funktionsaufruf)mitderweiterenAusführungsolangezuwarten,bisderangegebeneThreadbeendetist.

o join mit(long)Parameter:DeraktuelleThreadmaximaldieangegebeneZeitundfährtnachAblaufderZeitauchdannfort,wennderandereThreadnochnichtbeendetist.

o WenneinThread,fürdenjoin aufgerufenwurdeschonbeendetist,dannkehrtjoin() sofortzurück.

o Anwendung:¤ großeProblemekönneninmehrereTeilezerlegtwerden,wobeijedesTeilproblem

voneinemThreadgelöstwird(insbesonderebeiMehrprozessorsystemensinnvoll).ZumSchlussmüssenwirnurnochdaraufwarten,dassdieThreadszumEndegehen.DanachwerdendieTeilergebnisseeingesammelt:® join.

o AndereLösungfürzusammenlaufendeThreads:zusammenzufassendieserThreadsineinerThread-Gruppe.Dannkönnensiezusammenbehandeltwerden,sodassnurdasEndederThread-Gruppebeobachtetwird.

Page 57: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

60

Synchronisationmitjoin–Beispiel1/3

// Beispiel Bruce Eckel

class Sleeper extends Thread {

private int duration;

public Sleeper(String name, int sleepTime) {

super(name);

duration = sleepTime;

start();

}

public void run() {

try {

sleep(duration);

} catch (InterruptedException e) {

System.out.println(getName() + " was interrupted. " +

"isInterrupted(): " + isInterrupted());

return;

}

System.out.println(getName() + " has awakened");

}

}

Page 58: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

61

Synchronisationmitjoin–Beispiel2/3

class Joiner extends Thread {

private Sleeper sleeper;

public Joiner(String name, Sleeper sleeper) {

super(name);

this.sleeper = sleeper;

start();

}

public void run() {

try {

sleeper.join();

} catch (InterruptedException e) {

throw new RuntimeException(e);

}

System.out.println(getName() + " join completed");

}

}

Page 59: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

62

Synchronisationmitjoin–Beispiel3/3

public class Joining {

public static void main(String[] args) {

Sleeper sleepy = new Sleeper("Sleepy", 1500),

grumpy = new Sleeper("Grumpy", 1500);

Joiner dopey = new Joiner("Dopey", sleepy),

doc = new Joiner("Doc", grumpy);

grumpy.interrupt();

}

}

Grumpy was interrupted. isInterrupted(): false

Doc join completed

Sleepy has awakened

Dopey join completed

Page 60: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

63

Threads:Probleme

o Safety Hazards - dasProgrammverhältsichinAnwesenheitmehrererThreadsnichtmehrkorrekt.¤ race condition

o Liveness Hazards - ProblemebeideneneinProgrammmitmehrerenThreadsineinenZustandgerät,beidemeskeineFortschrittemehrmachenkann.¤ Deadlock Espassiertnichtsmehr.¤ Livelock PermanenterWechselzwischen2Zuständen,

ohnedassetwaspassiert¤ Starvation (Aushungern) EswerdenimmerandereThreadsbevorzugt.

o PerformanceHazards - EinProgrammdaszwarkorrektfunktioniert,diePerformanceistjedochtrotzmehrererThreadsschlecht.

Page 61: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

64

ThreadSicherheit

o EineKlasseistthread safe,wennsieauchbeiderVerwendungmehrererThreadskeinedergenanntenProblemezeigt.

o VieleKlassenderKlassenbibliotheksindnichtthread safe (z.B.SimpleDateFormat)undmüssenexplizitgeschütztwerden.

o Unveränderliche(immutable)Objektesindimmerthread safe (z.B.String).

o DiemeistenCollections sindnichtthread safe,könnenabermitCollections.synchronizedCollection()entsprechendverpacktwerden.

o VoneinigenKlassengibteszweiVarianten(StringBuffer,StringBuilder) - einethread safe,dieanderenicht.

è JavaMemoryModel

Page 62: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

65

JavaMemoryModel1/3

...regelt3Dinge:o Atomicity:WelcheOperationensindatomar,d.h.werden

nichtdurchandereThreadsunterbrochen?o Ordering:InwelcherReihenfolgewerdendieAktionen

abgewickelt(ReihenfolgeimQuelltext≠ReihenfolgeimausführbarenCode)?

o Visibility: WannwerdenModifikationenimSpeicher(fürdasselbeDatumkönnenmehrereKopienexistieren:imArbeitsspeicher,imCache,ineinemRegister)anderenThreadssichtbargemacht?

Page 63: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

66

JavaMemoryModel2/3

o Esgibtkeine sog.Sequential Consistency:EinThread,derspäterdrankommt,kannsehen,wasdieThreadsvorihmimSpeicherandengemeinsamverwendetenDatengemachthaben.¤ DasisteinwunderbarsimplesmentalesModell,wirdabervonJava

nichtunterstützt.

o EsgibtinderSprachspezifikationstattdesseneineReihevonGarantienfürdieReihenfolgevonOperationenundauchfürdieSichtbarkeitvonMemory-Modifikationen¤ ...abersiesindwesentlichschwächeralsunsererIntuition

entsprechendeSequential Consistency.

Page 64: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

67

JavaMemoryModel3/3

o Definiert,wiesichdieJavaVMbezüglichdesSpeichersverhaltenmuss.⇒PlattformunabhängigkeitderSprache.⇒UnterschiedlichesVerhaltenderPlattformen(z.B.IBMvs.Intel).

o Forderung„within-threadas-if-serial“:derSpeichermusssich(innerhalbeinesThread)soverhalten,alsobdieInstruktionensequentiellausgeführtwürden.

o DieVMdarfbeliebigeOptimierungenmachen,solangedieseGarantieerhaltenbleibt.

o Unteilbarsindnursog.atomareOperationen.

Page 65: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

68

AtomareOperationen

o EineatomareOperationkannnichtvoneinemanderenThreadgestörtwerden.Siefindetimmerganzodergarnichtstatt.

o OhneexpliziteSynchronisationsindnurfolgendeOperationeninJavaatomar:¤ Leseneines32-BitFeldes(byte,short,int,float,char,boolean).¤ Schreibeneines32-BitFelds(byte,short,int,float,char,boolean).

o Nichtatomarsind¤ LesenoderSchreibeneines64bitFeldes(long,double)¤ InkrementierenoderDekrementiereneines32bitFeldes;int i=0;i++;

o EsgibtspezielleKlassen,umkomplexereatomareOperationenzuprogrammieren:(java.util.concurrent.atomic.*).

Page 66: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

69

JavaMemoryModel(Folgerung):Beispiel

o Esistnichtgesichert,dassdieOperationenauf64-Bit-Datentypenunteilbarsind;eine64-Bit-Zuweisunglässtsichauszwei32-Bit-Zuweisungenzusammensetzen.

o Eskannalsopassieren,dasseinThreadmittenineinerlong- oderdouble-OperationvoneinemanderenThreadverdrängtwird.

o GreifenzweiThreadsaufdiegleiche64-Bit-Variablezu,sokönntemöglicherweisedereineThreadeineHälfteschreibenundderandereThreaddieandere.

a = 0x00000000 00000000 a = 0xFFFFFFFF FFFFFFFF

o a = 0x00000000 00000000

o a = 0xFFFFFFFF FFFFFFFF

o a = 0x00000000 FFFFFFFF

o a = 0xFFFFFFFF 00000000

MöglicheErgebnisse:

Thread-1:a=0 Thread-2:a=-1

Page 67: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

70

VolatileVariablen

o DieGarantiendesJavaMemoryModelsgeltennurinnerhalbeinesThreads,nichtaberüberThreadshinweg.

o DerModifier volatile erweitertdieGarantienfüreineVariablebeimehrerenThreads,dieaufdieseVariablezugreifen:atomarerLese-/Schreibzugriff.

o EinThreaddervoneinervolatileVariablenliest,siehtimmerdenletztenundaktuellenWert,deneinandererThreadhineingeschriebenhat.

o FürdieJavaVMbedeutetdas¤ volatileVariablendürfennichtinRegisternabgelegtwerden.¤ volatileVariablendürfennichtanderweitiggecached werden.¤ volatileVariablenerzwingeneinenSpeicherschutz.

Page 68: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

71

within-threadas-if-serial:Beispiel

long i, k, m;

i = 15

i++;

k = 18;

k++;

m = i + k;

long i, k, m;i = 15k = 18;k++;i++;m = i + k;

Ergebnis nur innerhalb eines

Threads identisch.

Page 69: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

72

volatile:Beispiel

o VeränderteinandererThreadwährenddesWartensdieVariablecnt,könntedennochi=j sein,wenndieLaufzeitumgebungdieVariablej nichtfrischmitdemWertauscnt initialisiert.

o Variablecnt mitvolatilekennzeichnen→ dasErgebniswirdnichtimZwischenspeicher(Thread-Cache)belassen,sondernständigaktualisiert.¤ DieparallelenThreadssehensomitimmerdenkorrekten

Variablenwert,daervorjederBenutzungausdemSpeichergelesenundnacheinerÄnderungsofortwiederzurückgeschriebenwird.

int cnt; …

int i = cnt;

Thread.sleep( 10000 );

int j = cnt;

volatile int cnt; …

int i = cnt;

Thread.sleep( 10000 );

int j = cnt;

Ergebnis auch Thread-übergreifend identisch.

Page 70: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

73

InterfaceRunnable1/2

o Esistnichtimmermöglich,eineKlasse,derenExemplarealsThreadlaufensollen,vonThreadabzuleiten.¤ Diesistinsbesonderedannnichtmöglich,wenndieKlasseBestandteil

einerVererbungshierarchieist,dieeigentlichnichtsmitMultithreadingzutunhat.

¤ DaJavakeineMehrfachvererbungkennt,kanneinebereitsabgeleiteteKlassenichtvoneinerweiterenKlasseerben.

¤ DasehrunterschiedlicheKlassenalsThreadparallelzuvorhandenemCodeausgeführtwerdenkönnen,istdieseinesehrunschöneEinschränkungdesMultithreading-KonzeptsvonJava.

o Ausweg:ThreadsnichtdurchAbleitenausThread,sonderndurchImplementierungdesInterfacesRunnable zuerzeugen.

o JedeKlasse,derenExemplarealsThreadlaufensollen,mussdasInterfaceRunnable implementieren(sogardieKlasseThread selbst).¤ Runnable enthältnureineeinzigeDeklaration:diederMethoderun.

Page 71: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

74

InterfaceRunnable2/2

o UmeinenichtvonThreadabgeleiteteInstanzindieserWeisealsThreadlaufenzulassen,istinfolgendenSchrittenvorzugehen:

¤ ErzeugeneinesneuenThread-Objekts.¤ AndenKonstruktor wirddasObjektübergeben,dasparallelausgeführt

werdensoll.¤ DieMethodestart desneuenThread-Objektswirdaufgerufen.

è DasThread-Objektstartetdierun-MethodedesübergebenenObjekts,dassiedurchdieÜbergabeimKonstruktor kennt.DadiesesObjektdasInterfaceRunnable implementiert,istgarantiert,dasseinegeeigneteMethoderun zurVerfügung steht.

public Thread(Runnable target)Erzeugt einen neuen Thread für die Runnable-Implementierung target.

Page 72: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

75

InterfaceRunnable- Beispiel

// Beispiel: Bruce Eckel - SimpleThread using the Runnable interface.

public class RunnableThread implements Runnable {

private int countDown = 5;

public String toString() {

return "#" + Thread.currentThread().getName() + ": " + countDown;

}

public void run() {

while(true) {

System.out.println(this);

if(--countDown == 0) return;

}

}

public static void main(String[] args) {

for(int i = 1; i <= 5; i++)

new Thread(new RunnableThread(), "" + i).start();

}

}

Page 73: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

76

ThreadserweiternoderInterfaceRunnableimplementieren?

Vorteile Nachteile

Threads erweitern Programmcode in run() kann die Methoden der Klasse Thread nutzen.

Da es in Java keine Mehrfachvererbung gibt, kann die Klasse nur Thread erweitern. Unnatürliche Klassenhierarchie.

Interface Runnable implementieren

Die Klasse kann von einer anderen, problem-spezifischen Klasse erben.

Kann sich nur mit Umwegen selbst starten; allgemein: Thread-Methoden können nur über Umwege genutzt werden.

Page 74: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

77

AutomatischesStarteneinesThreadbeiderErzeugung

class ThreadAutoStart implements Runnable {ThreadAutoStart() {

new Thread( this ).start();}public void run() {. . .

}}

Ein Objekt verwaltet seinen eigenen Thread, der im Konstruktor gestartet wird.Dort muss ein Thread-Objekt für die Runnable-Umgebung angelegt und die start()-Methode ausgeführt werden.

Page 75: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

78

Hintergrundprozesse– Dämonen(Daemons)

o FürdiebisherigenProgrammengilt:eingestarteterThread,sofernereineEndlosschleife(wiez.B.einServer)enthält,wirdniebeendet.

o Wennrun()nieterminiert,soläuftderThreadimmerweiter,auchwenndieHauptapplikationbeendetist.

o Diesistnichtimmerbeabsichtigt,wenndieApplikationbeendetist.o DannsollteauchderendloseThreadbeendetwerden.o EinimHintergrundarbeitenderThreaderhälteinespezielleKennung:er

wirdalsDämon gekennzeichnet.o StandardmäßigisteinThreadkeinDämon.o WenndasHauptprogrammbeendetistunddieLaufzeitumgebung

erkennt,dasskeinnormalerThreadläuft,sondernnurDämonen,dannwerdendiese(gewissermaßenvonaußen)terminiert.

Thread Daemon

setDaemon()

setDaemon(false)

Page 76: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

79

Daemon- Beispiel

// Beispiel von Bruce Eckel

// Daemon threads don't prevent the program from ending.

public class SimpleDaemons extends Thread {

public SimpleDaemons() {

setDaemon(true); // Must be called before start()

start();

}

public void run() {

while(true) {

try { sleep(100);

} catch (InterruptedException e) {

throw new RuntimeException(e);

}

System.out.println(this);

}

}

public static void main(String[] args) {

for(int i = 0; i < 10; i++) new SimpleDaemons();

}

}

Page 77: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

80

Daemon- Beispiel

class DaemonThread extends Thread {DaemonThread () {

setDaemon( true );

}

public void run() {

while ( true ) ;

}

public static void main( String args[] ) {

new DaemonThread().start();

}

}

Page 78: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

82

VerwaltenvonThreads1/3

o ThreadsbesitzenaucheineReiheadministrativerEigenschaften.

o Eigenschaften,diebeidenThreadsselbstzufindensind,beispielsweisediePrioritätoderderNameeinesThreads:¤ JederThreadinJavahateineneindeutigenNamen.¤ DerNamewird

n imKonstruktoraufruf explizitvergeben,n mitderMethodesetName gesetzt/geändert,n automatischgeneriert,inderForm"Thread-"+n,wobein einint ist.

java.lang.Thread

Page 79: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

83

VerwaltenvonThreads2/3

o ThreadshabeneinePriorität.¤ DiePrioritätsteuertdenSchedulerinderWeise,dassbei

VorhandenseinmehrererbereiterThreadsdiejenigenmithöhererPrioritätvordenenmitniedrigererPrioritätausgeführtwerden.

¤ BeimAnlegeneinesneuenThreadsbekommtdieserdiePrioritätdesaktuellenThreads.MitHilfederMethodesetPriority kanndiePrioritätgesetztundmitgetPriority abgefragtwerden.

java.lang.Thread

Page 80: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

84

VerwaltenvonThreads3/3

o JederThreadinJavagehörtzueinerThread-Gruppe,dieuntereinanderüberVater-Kind-BeziehungenmiteinanderinVerbindungstehen:¤ VerwaltenvonInformationen,dienichtnurfüreineneinzelnenThread

vonBedeutungsind,sondernfüreineganzeGruppe.¤ EnthaltenMethoden,dieaufalleThreadseinerGruppeangewendet

werdenkönnen.¤ EsistmöglichdieThreadseinerGruppeaufzuzählen.è InderJava-KlassenbibliothekgibteszudiesemZweckeineeigene

KlasseThreadGroup:n getThreadGroup liefertdasThreadGroup-Objekt,demderaktuelleThreadangehört.

n MitdergetParent vonThreadGroupkanndieVater-Thread-Gruppeermitteltwerden.

java.lang.ThreadGroup

Page 81: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

86

KlassenundInterfacesderConcurrency Utilities

o Bisher(undvorJava5):InterfaceRunnable,KlasseThread+einpaarSynchronisationsmechanismen.

Þ Vorteil:Elegantes,flexibelnutzbaresundschlankesKonzept.Þ Nachteil:ManmussfürwiederkehrendeAufgabeneigene

Klassenschreiben(Queue-KlassenfürErzeuger-Verbraucher-Anwendungen),KlassenzumPoolen vonThreads,Semaphore,etc.

o SeitJava5:EineReihevonBibilotheksklassen fürProbleme,diemanbisherselbstimplementierenmusste.à java.util.concurrent

Page 82: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

87

GrundideederConcurrency Utilities

o Programmierern werden fertige Bausteine für die Anwendungsent-wicklung zur Verfügung gestellt (ähnlich wie das Collection Framework).

o BestandteilederConcurrency Utilities:¤ Concurrent Collections

n SpezielleImplementierungenderCollection FrameworkInterfacesMap,Set,List,Queue,Deque.

¤ Executor Frameworkn EinFrameworkzurAusführungasynchronerTasksdurchThreadpools.

¤ Synchronizersn DiverseHilfsklassenzurKoordinationmehrererThreads,zumBeispielSemaphoreoder

CyclicBarrier.¤ Locks undConditions

n FlexiblereObjektrepräsentationdessynchronized Schlüsselwortssowiederjava.lang.Object MonitorMethodenwait(),notify()undnotifyAll().

¤ Atomic Variablesn ErlaubendieatomareManipulationeinzelnerVariablen(CAS- Compare And Set)zur

ImplementierungvonAlgorithmenohneSperren(lock-free algorithms).

o FürdiegängigenFälleinderAnwendungsentwicklungbesitzendieConcurrent Collections sowiedasExecutor FrameworkeinenhohenStellenwert.

Page 83: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

88

FertigeLösungendesconcurrent-Paketes

o Sperrkonzept,dasnichtmehrandieBlockstrukturgebundenist.¤ Lock,ReentrantLock

o FeingranulareThreadsynchronisationundSteuerung¤ Barrier,Latch,Semaphore

o ParalleleTasksundderenAusführungssteuerung¤ Executor¤ Future

o Producer/ConsumermitBlockingQueueo Performante,threadsichereCollections

¤ ConcurrentHashMap¤ CopyOnWriteArrayList

o EigenekomplexereatomareOperationenmitjava.util.concurrent.atomic erstellen.

Page 84: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

89

Sperren(InterfaceLock)- Ausschnitt

o void lock()¤ Wartetsolange,bisderkritischeAbschnittbetretenwerdenkann,undmarkiert

ihndannalsbetreten.o boolean tryLock()

¤ WennderkritischeAbschnittsofortbetretenwerdenkann,istdieFunktionalitätwiebeilock()unddieRückgabeisttrue.IstderLockgesetzt,sowartetdieMethodenichtwielock(),sondernkehrtmiteinemfalse zurück.

o boolean tryLock(long time,TimeUnit unit )throws InterruptedException¤ VersuchtinderangegebenenZeitspannedenLockzubekommen.DasWarten

kannmitinterrupt()aufdemThreadunterbrochenwerden,wastryLock()miteinerException beendet.

o void unlock()¤ VerlässtdenkritischenBlock.

o void lockInterruptibly()throws InterruptedException¤ Wartetwielock(),umdenkritischenAbschnittbetretenzudürfen,kannabermit

eineminterrupt()vonaußenabgebrochenwerden.(Derlock()-MethodeisteinInterruptegal.)ImplementierendeKlassenmüssendieseVorgabenichtzwingendumsetzen,sondernkönnendieMethodeauchmiteinemeinfachenlock()realisieren.ReentrantLock implementiertlockInterruptibly()erwartungsgemäß.

java.util.concurrent.locks.Lock

Page 85: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

90

ReentrantLock (interface)- Ausschnitt

o ReentrantLock()¤ ErzeugteinneuesLock-Objekt,dasnichtunbedingtdemamlängsten

WartendendenerstenZugriffgibt.

o ReentrantLock(boolean fair)¤ ErzeugteinneuesLock-ObjektmitfairemZugriff,gibtalsodemam

längstenWartendendenerstenZugriff.

o boolean isLocked()¤ Anfrage,obderLockgeradegenutztwirdundimMomentkein

Betretenmöglichist.

o finalint getQueueLength()¤ Ermittelt,wievieleaufdasBetretendesBlockswarten.

o int getHoldCount()¤ GibtdieAnzahldererfolgreichenlock()-Aufrufeohnepassendes

unlock()zurück.SolltenachBeendendesVorgangs0sein.

java.util.concurrent.locks.ReentrantLock

Page 86: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

91

AusführungvonTasks- Executors

Executor

{Interface}

ExecutorService{Interface}

Abstract ExecutorService{abstract}

ThreadPoolExecutor

Klassen und Interfaces im Zusammenhang mit dem Threadpool

Bietet die Funktionalität, eine Tätigkeit, die Runnable implementiert hat, auszuführen.

• Service Management Funktionalität, um den Service zu beenden, seinen Status abzufragen, etc.,

• die Möglichkeit Callables ausführen zu lassen.

• Threadpool = Abstraktion, die eine Anzahl von erzeugten und bereits gestarteten Threads vorrätig hält, um mit ihnen asynchrone Tätigkeiten auszuführen.Bsp.: Ein Application Server wird einen Threadpool enthalten, um die hereinkommenden Serviceanfragen asynchron damit auszuführen.

Page 87: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

92

AusführungvonTasks- Executors

o Threads¤ ZurAusführungeinesRunnableà esmussimmereinneuesThread-

Objektaufgebautwerden,dennstart()istnureinmalaufeinemThread-Objekterlaubt(sonst:java.lang.IllegalThreadStateException).

¤ WürdederselbeThreadwährendseinesLebenszykluseineReiheunterschiedlicherRunnable abarbeitenwollenà andereUmsetzungistnötig.

¤ WenndasRunnable nichtsofort,sondernspäter(Ostern)oderwiederholt(immerWeihnachten)ausgeführtwerdensollà andereUmsetzungistnötig.

o Excecutor¤ FührtTasksineigenemThreadsaus.¤ ÜbernimmtdasPoolingderThreads.¤ ErlaubtTasksfürspätereZeiträumeeinzuplanen.

Page 88: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

93

Executors(Ausführer)

o ImPackage:java.util.concurrent alsSchnittstellevereinbart.

o AbstraktionfürKlassen,dieBefehleüberRunnable ausführen.o void execute(Runnable command) - wirdspätervon

Klassenimplementiert,dieeinRunnable abarbeitenkönnen.o Jeder,dernunBefehleüberRunnable abarbeitet,istExecutor.o VondieserSchnittstellegibtesbisherzweiwichtige

Implementierungen:¤ ThreadPoolExecutor.DieKlassebauteineSammlungvonThreads

auf,denThread-Pool.AusführungsanfragenwerdenvondenfreienThreadsübernommen.

¤ ScheduledThreadPoolExecutor.EineErweiterungvonThread-PoolExecutor umdieFähigkeit,zubestimmenZeitenodermitbestimmtenWiederholungenBefehleabzuarbeiten.

o DiebeidenKlassenhabennichtganzsotrivialeKonstruktoren;eineUtility-Klasse(Executors)vereinfachtdenAufbaudieserspeziellenExecutor-Objekte.

Page 89: MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o Monitor: Objekt (Sperrvariable), das bestimmte Attribute in sich einschließt, auf

94

Executor (interface)

o FührteineübergebeneRunnable Taskaus.o EntkopplungderTask-AusführungvondenMechanismendes

Task- Managements(inkl.DetailsderThread-VerwendungoderScheduling).

o EinExecutor ersetztdieexpliziteErzeugungvonThreads.o Beispiel:

new Thread(new(RunnableTask())).start() wird ersetzt durch

Executor executor = anExecutor;

executor.execute(new RunnableTask1());

executor.execute(new RunnableTask2()); etc.