MULTITHREADING 6. Kapitelservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel06.pdf · o...
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.