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

Post on 08-Aug-2019

219 views 0 download

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

TechnikenderProgrammentwicklung

Prof.Dr.WolfgangSchramm

MULTITHREADING6.Kapitel

1

Übersicht

1. ProgrammstrukturierungmitPaketen(packages)

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

2

LernzieledesKapitels

¨ Verstehen,wasNebenläufigkeitistundwiesiefunktioniertundinwelchenAnwendungensieeingesetztwird.

¨ DiebeidenwichtigstenKonzeptederNebenläufigkeitkennenlernen.

¨ ImplementierungderNebenläufigkeitinJavakennenlernen.

¨ ZuständevonThreadskennenlernen.¨ Synchronisationsmechanismenfür

Threadskennenlernen.¨ ProblemebeiderSynchronisationvon

Threadserkennenundvermeidenlernen.

¨ EigeneThreadsimplementierenundsynchronisierenkönnen.

¨ Threadsverwaltenkönnen.

2

3

Literaturempfehlung

¨ NichtnurfürdiesesKapitel- auchdarüberhinaus.

4

Inhalt

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

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

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.

6

WannistparalleleProgrammierungsinnvoll?

Ressource Belastung

Hauptspeicherzugriffe Prozessor

Dateioperationen Festplatte

Datenbankzugriffe Server, Netzwerkverbindung

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.

8

Interprozesskommunikation

Betriebssystem Prozess 1

Prozess n

Prozess 2

Speicherbereich 1

Speicherbereich 3

Speicherbereich 2

shared memory

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

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

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.

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).

13

ThreadsinJava2/2

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

o DasScheduling kannwahlweiseunterbrechendodernichtunterbrechendimplementiertsein.

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

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.

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 () { ... }

...

}

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

17

TerminierungvonThreads

o BeendeneinesThreaddadurch,dassdasEndeseinerrun-Methodeerreichtist.

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

n SpeichernundAbfrageneinerUnterbrechungsanforderungineigenenMembervariablen.

n VerwendungvonMethoden(interrupt,etc.)derKlasseThread.

o WasistbeieinemAbbrechenvonaußenzubeachten?

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.

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

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)

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

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:+++.*.*..*..*.**.**.**.*.***.***..**.*.....

24

Thread-Objekte

o ThreadssindgewöhnlicheObjektemitbeliebigenMembervariablenundMethoden.

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

o GreifenmehrereThreadsaufFelderandererObjektezu,danngreifensieaufdieselbenDatenzu.¤ EinThreadkannDatenineinemObjektablegen,diedortvoneinem

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

werden.

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

26

Threads– ZugriffaufgemeinsameDaten2/2

Thread1

...

liesbalance

addiere500

SpeicheredasErgebnisinbalance

...

Thread 2

...

lies balance

subtrahiere 500

Speichere das Ergebnis in balance

....

Welcher Wert steht in balance?

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.

28

ProblemederParallelität

o ProblemeinThreadprogrammensindnursehrschwerzureproduzierenunddamitzutestenà tretenhäufigerstimProduktivsystemauf.

o Grundproblem:MenschenkönnennurschlechtinparallelenAbläufendenken.

29

Threads:Probleme

o Safety Hazards - dasProgrammverhältsichinAnwesenheitmehrererThreadsnichtmehrkorrekt.¤ race condition

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

o PerformanceHazards - EinProgrammdaszwarkorrektfunktioniert,diePerformanceistjedochtrotzmehrererThreadsschlecht.

30

SynchronisationvonThreads

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

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.

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.

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.

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

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:+++.*.*..*..*.**.**.**.*.***.***..**.*.....

37

Thread-Objekte

o ThreadssindgewöhnlicheObjektemitbeliebigenMembervariablenundMethoden.

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

o GreifenmehrereThreadsaufFelderandererObjektezu,danngreifensieaufdieselbenDatenzu.¤ EinThreadkannDatenineinemObjektablegen,diedortvoneinem

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

werden.

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

39

Threads– ZugriffaufgemeinsameDaten2/2

Thread1

...

liesbalance

addiere500

SpeicheredasErgebnisinbalance

...

Thread 2

...

lies balance

subtrahiere 500

Speichere das Ergebnis in balance

....

Welcher Wert steht in balance?

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.

41

ProblemederParallelität

o ProblemeinThreadprogrammensindnursehrschwerzureproduzierenunddamitzutestenà tretenhäufigerstimProduktivsystemauf.

o Grundproblem:MenschenkönnennurschlechtinparallelenAbläufendenken.

42

Threads:Probleme

o Safety Hazards - dasProgrammverhältsichinAnwesenheitmehrererThreadsnichtmehrkorrekt.¤ race condition

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

o PerformanceHazards - EinProgrammdaszwarkorrektfunktioniert,diePerformanceistjedochtrotzmehrererThreadsschlecht.

43

SynchronisationvonThreads

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

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.

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.

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.

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.

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

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.

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.

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).

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

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.

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.

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.

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.

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.

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");

}

}

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");

}

}

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

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.

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

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?

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.

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.

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.*).

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

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.

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.

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.

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.

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.

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();

}

}

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.

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.

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)

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();

}

}

80

Daemon- Beispiel

class DaemonThread extends Thread {DaemonThread () {

setDaemon( true );

}

public void run() {

while ( true ) ;

}

public static void main( String args[] ) {

new DaemonThread().start();

}

}

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

83

VerwaltenvonThreads2/3

o ThreadshabeneinePriorität.¤ DiePrioritätsteuertdenSchedulerinderWeise,dassbei

VorhandenseinmehrererbereiterThreadsdiejenigenmithöhererPrioritätvordenenmitniedrigererPrioritätausgeführtwerden.

¤ BeimAnlegeneinesneuenThreadsbekommtdieserdiePrioritätdesaktuellenThreads.MitHilfederMethodesetPriority kanndiePrioritätgesetztundmitgetPriority abgefragtwerden.

java.lang.Thread

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

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

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.

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.

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

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

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.

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.

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.

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.