Multithreading

Werbung
Multithreading
Motivation und Grundlagen
Threadzustände und Prioritäten
Synchronisation
Weiteres
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
1
Multithreading
Threads in Java sind quasiparallele Programmabläufe innerhalb einer VM
Threads in Java sind ein sehr mächtiges und bequemes Konzept, um nebenläufige
Abläufe zu realisieren, wie z.B.:
•
Applikationslogik und Benutzerinteraktion bei GUI-Anwendungen
•
interaktive Anwendungen bei denen mehrere Aktivitäten gleichzeitig laufen sollen
•
Bedienung von mehreren gleichzeitigen Anforderungen an Server
•
Animationen mit mehreren aktiven Agenten
•
…
Threads in Java laufen in einem gemeinsamen Speicherbereich
Threads können/müssen kooperieren, insbesondere bei der Verwendung von
gemeinsam benutzten Objekten (Shared Memory)
single-threaded
multi-threaded
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
2
Klassendiagramm (Auszug)
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
3
Überblick über Klassen
:
-Objekte repräsentieren einen Thread
•
definiert Methoden für starten, unterbrechen, …
•
definiert
-Methoden, um
- aktuell laufenden Thread zu steuern, z.B. ihn schlafen zu legen
- Verwaltung aller aktuell existierenden Threads
:
•
Interface
definiert eine Methde
auszuführenden Code beinhaltet
welche den von einem Thread
implementiert
kann aber auch mit einem eigenen
-Objekt erzeugt werden
:
•
in Klasse
ist ein Monitor implementiert, d.h. jedes Objekt in Java kann zur
Thread-Synchronisation verwendet werden
•
wesentlichen Methoden sind
und
, bzw.
: Für das Bilden von Gruppen von Threads
: Exception geworfen bei Unterbrechung
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
4
Erzeugen, Starten, Ablauf eines Threads (1)
Beispiel: BallThread
Variante: Ableiten von
Thread wird abgeleitet (z.B.
von
überschrieben
-Objekt wird mit
Thread wird mit
ausgeführt
% # "
(
" ")"
( +
*
"
+
*
) und
erzeugt
gestartet und damit
&%
# "'
(
*
"'
")"
"
*
,
+++
,
"
Der Thread läuft bis zum Ende der Methode
und stirbt dann
"
")"
$
*"
,
Die static-Methode
!"#
erlaubt es, den aktuellen Thread für eine
gegebene Zeit „Schlafen zu legen“
Achtung:
wirft
daher mit
werden
"'
"'"
(
"'
"
"'
")"-*" ".)"-///*" 00 "'
+# (
*
+
1 *
und muss
-Anweisung geklammert
,
,
"
'
,
,
(
" *
,
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
5
Erzeugen, Starten, Ablauf eines Threads (2)
Variante: Eigenes
Beispiel: BallThread
-Objekt
%
Die Methode
wird in einem eigenen
-Objekt implementiert (im Bsp.
(
" ")"
( +
"
+
)
-Objekt wird mit
erzeugt, wobei das
-Objekt als Parameter übergeben wird
Thread wird mit
des
gestartet und damit
-Objekts ausgeführt
# "
&%
# "'
(
*
"'
*
")"
*
"
*
,
+++
,
" #
#
"'
+++
(
"'
"
"'
# (
")"-*" ".)"-///*" 00 "'
*
+
1 *
,
,
"
'
,
,
+++
,
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
6
Multithreading
Motivation und Grundlagen
Threadzustände und Prioritäten
Synchronisation
Weiteres
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
7
Thread-Zustände
: wurde gerade erzeugt und noch nicht
gestartet
2
!:
3
(: wird gerade ausgeführt
: kann ausgeführt werden und
wartet auf Zuteilung des Prozessors
blockiert:
: wurde mit
gelegt
4
schlafen
3
: wartet auf Beendigung
einer IO-Operation
: wurde mit
in den
wartenden Zustand versetzt
!
: Wartet auf die Aufhebung
einer Objekt-Sperre
: durch
vorübergehend blockiert
Achtung: ist veraltet und sollte nicht
verwendet werden
5
4Methode hat terminiert
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
8
Scheduling und Prioritäten
Die lauffähigen Threads müssen sich den Prozessor zur Ausführung teilen; sie
konkurrieren um die Zuteilung des Prozessors
Java legt keine Zuteilungsstrategie fest; diese ist abhängig vom Laufzeitsystem
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
9
Scheduling und Prioritäten (2)
Mit der Methode
(
"
6
"
kann man einem Thread eine Priorität für die Zuteilung geben
Prioritätswerte liegen zwischen 7 896
7 ;96
:")"-/ mit 8 796
:")"/ und
:")"1 als Standardwert
(siehe Bsp.: (<+(< -+
Beispiel:
(
in CoreJava)
"=
"
'
" ")"
( +
+
+
, der Methode
Mit
(
"
*
*
"
6
")"
*
*"
*
s mit höherer
Priorität werden bevorzugt
"(
"
bewegt
kann ein Thread seine Kontrolle des Prozessors abgeben und anderen die Chance zur
Zuteilung geben.
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
10
Unterbrechung und Terminieren
Unterbrechen von Threads durch
void
d.h., befindet sich der Thread in einem blockierten Zustand, wird eine
geworfen und der Thread aktiviert.
Mit static-Methode
"
"
wird für den aktuellen Thread der Interrupt-Status abgefragt und rückgesetzt (!)
Interrupts sind insbesondere für die außerordentliche Terminierung eines Threads
wichtig
"(
"
"'
>
'
$$" " #
!
-/// *"
,"
"'"
$$"
"
*
,
,
$$"
"'
$$"% ! "
$$"
"
$$" #"
?
"
#
"
"
"
"
"? "
?
#
,
Anmerkung:
Dieses Vorgehen kann die gefährliche
mehr verwendet werden soll
Pratikum SWE 2
-Anweisung ersetzen, die nicht
© M. Löberbauer, T. Kotzmann, H. Prähofer
11
Multithreading
Motivation und Grundlagen
Threadzustände und Prioritäten
Synchronisation
Weiteres
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
12
Wechselseitiger Ausschluss
Greifen mehrere Threads gleichzeitig auf ein Objekt zu, muss wechselseitiger
Ausschluss bei nicht-atomaren Operationen realisiert werden
Beispiel: Banktransaktionen
• In einer Bankapplikation wird
zwischen Konten Geld transferiert;
Addieren und Subtrahieren sind nicht atomar
Pratikum SWE 2
(
'
# "
@
@
#A"4)" #
A"0)" #
"
#
*
*
,
© M. Löberbauer, T. Kotzmann, H. Prähofer
13
Monitor
Zur Realisierung von wechselseitigem Ausschluss ist in der Basisklasse
ein Monitor-Konzept realisiert
Monitor hat einen Schlüssel (Lock) und verwaltet eine Queue
•
Thread können Lock anfordern
•
werden eventuell in der Queue als wartend auf den Lock gespeichert
•
bei Freiwerden des Locks erhält nächster in Queue den Lock und kann Ausführung
fortsetzen
damit kann ein beliebiger Code (aber insbesondere eine Methode des Objekts)
unter exklusivem Zugriff auf das Objekt ausgeführt werden
dies passiert, indem man eine Methode oder einen Block als
?
deklariert
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
14
synchronized Methode
Wird eine Methode als synchronized deklariert, muss bei Ausführung der Methode der
) erhalten werden
Lock des Objekts (
Ist dieser nicht verfügbar, kann die Methode nicht begonnen und es muss auf die
Zuteilung des Locks gewartet werden
Handelt es sich um eine statische Methode wird auf das Klassenobjekt synchronisiert
Methode gelockt auf
-Objekt
3"'
+++
?
(
@
@
# "
#A"4)" #
A"0)" #
"
#
"'
*
*
,
+++
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
15
synchronized Block
Es kann auch jeder beliebige Block auf ein beliebiges Objekt synchronized deklariert
werden
Damit kann der Block nur betreten werden, wenn man den Lock des Objekts hat
=
#
"
(
"'
" *
Block gelockt
auf Objekt o
+++
(
"'
"'
?
$$"!
"'
3 "
"
3 "
,
,
,
,
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
16
und
Soll ein synchronisierter Code nicht fortgesetzt werden, kann er den Lock zurückgeben
und den Thread als „wartend auf das Objekt“ einreihen
Klasse
stellt dazu Methoden zur Verfügung
der Thread wird als wartend auf das Objekt blockiert;
Lock auf das Objekt wird freigegeben
!
#
wie
, zusätzlich erfolgt nach
ein Interrupt
#
Millisekunden
Es wird ein (!) auf das Objekt wartender Thread aufgeweckt
Es werden alle auf das Objekt wartenden Threads
aufgeweckt
Beispiel: Warten bis Konto gefüllt
?
(
# "
"
#
'
@
#A"." #
*
@
#A"4)" #
@ A"0)" #
*
*
*
,
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
17
Multithreading
Motivation und Grundlagen
Threadzustände und Prioritäten
Synchronisation
Weiteres
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
18
join
Oft ist es notwendig einen Sohn-Thread zu erzeugen und den Ablauf mit
diesem abzustimmen
Die Anweisung
terminiert ist.
erlaubt es, auf einen Thread zu warten, bis dieser
Beispiel:
" ")"
"'
"(
$C"
$$"
"'
"
# "B
3
"(
"
"
"C$
,
,*"
+
+
$$"
*"
*
? "
$$"
"
"
" "
#
"
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
19
Thread-Gruppen
Oft ist es sinnvoll und hilfreich Threads zu Gruppen zusammenzufassen, um
diese gemeinsam behandeln zu können
• z.B. alle Threads in der Gruppe zu unterbrechen
Dazu dient die Klasse
von Threads erfolgen kann
, mit der eine hierarchische Gruppierung
erlaubt:
• Unterbrechen aller Threads in der Gruppe
• Exceptions, die innerhalb eines enthaltenen Threads auftreten,
zu behandeln
• Zugriff auf die enthaltenen Threads
• Informationen über die enthaltenen Threads abfragen
Threads können bei ihrer Erzeugung einer
zugeordnet werden
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
20
Ende der Applikation und Daemon-Threads
Eine Applikation wird beendet, wenn alle ihre Threads terminiert (tot) sind
Eine Ausnahme bilden dabei aber die sogenannten Daemon-Threads;
diese werden automatisch beendet, wenn der letzte Nicht-Daemon-Thread einer
Applikation terminiert hat
Daemon-Threads verwendet man daher für Hilfsdienste
Threads können durch Setzen der daemon-Property mit
(
"
D
#
zu Daemon-Threads gemacht werden
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
21
Veraltete Methoden
stop:
• Mit
kann man einen Thread „töten“; er wird sofort terminiert
• sollte nicht verwendet werden, weil dadurch jede Aktion sofort beendet wird und
dadurch inkonsistente Zustände der bearbeiteten Objekte entstehen können
• Bsp.
bei
3: Es wird zwar von einem Konto noch abgehoben aber
auf das andere Konto nicht mehr gebucht
suspend / resume:
• Mit
kann ein Thread vorübergehend blockiert und mit
aufgeweckt werden
#
wieder
• dabei gibt er aber Locks von Objekten nicht frei (der Lock kann erst wieder frei
gegeben werden, wenn der Thread mit
#
wieder aufgeweckt wird)
• Dadurch können sehr leicht Deadlocks entstehen, die Verwendung von suspend wird
nicht empfohlen
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
22
Beispiel: Producer – Consumer (1)
•
Producer produziert Elemente und schreibt sie in den Puffer
•
Consumer konsumiert produzierte Elemente aus dem Puffer
#
"
( +
+
E
*
'
(
#
B
!@A"
!
'
E
6
=
#
"
")"
E
" ")"
6
" ")"
=
#
*
$$"
E
" F "6
*
$$"
?
!
"6
*
$$"
?
!
"=
+
*
$$"B
"6
+
*
$$"B
"=
#
#
,
,
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
23
Beispiel: Producer – Consumer (2)
#
( +
+C*
6
"
(
"'
E
"
*
6
E
+
")"
"
"'
*
,
(
B
"'
!" *
>
"'
?
")"GH
"G"0"7
+
B
"'
$$"B
+
#
$$"
+
+
G6
"6
*
*
#+
"
?
"
?
!
"G"0"
"
?
*
$$"
*
#
! "
"=
#
,
'
+
-//C7
,"
+
"
#
*
$$"
"'
*
,
,
,
,
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
24
Beispiel: Producer – Consumer (3)
=
#
"
"'
(
E
=
#
+
")"
"
*
E
"
"'
*
,
(
"'
>
"'
'
?
$$"B
"'
+
?
+
"
"6
"."- ""'
*
$$"
"
$$"3
#
"
"
"
,
B
+
B
#+
+
# (
/ *
#+
+
G"I
#
"
"G0 B
G" (
5"G0
!
+
?
+!
/
*
0G G *
,
+
-//C7
,"
+
"
#
*
$$"
"'
*
,
,
,
,
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
25
API Zusammenfassung (1)
"
"
#
#
"
A thread is a thread of execution in a program. The Java Virtual Machine allows an application to have multiple threads of execution
running concurrently.
(
(
(
Allocates a new Thread object.
!
"
Allocates a new Thread object with a Runnable object .
!
"
!
"
Allocates a new Thread object with a Runnable object and assigns it to the group.
"
"
(
Tests if this thread is alive.
" D #
"
Tests if this thread is a daemon thread.
"
"
Tests whether this thread has been interrupted.
"
"
E 3
Returns true if and only if the current thread holds the monitor lock on the specified object.
"
"
"#
"
"
"
+"D
"
!" "
+"=
"
"
"#
" "
"
" "
.
"
"
D #
Marks this thread as either a daemon thread or a user thread.
"
6
"
6
Changes the priority of this thread.
(
"
! #
"
Causes the currently executing thread to sleep (temporarily cease execution) for the specified number of milliseconds.
"(
"
"
Interrupts this thread.
"
"(
"
"
"
Waits for this thread to die.
(
"
"
Causes the currently executing thread object to temporarily pause.
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
4
26
API Zusammenfassung (2)
"
"
The Runnable interface should be implemented by any class whose instances are intended to be executed
by a thread. The class must define a method of no arguments called run.
(
"
"
When an object implementing interface Runnable is used to create a thread, starting the thread causes the
object's run method to be called in that separately executing thread.
"
"
"
Thrown when a thread is waiting, sleeping, or otherwise paused for a long time and another thread interrupts
it using the interrupt method in class Thread.
Class Object is the root of the class hierarchy. Every class has Object as a superclass. All objects, including
arrays, implement the methods of this class.
(
"
"
Causes current thread to wait until another thread invokes the notify() method or the notifyAll() method for
this object.
(
"
!
#
"
Causes current thread to wait until either another thread invokes the
(
"
"
Wakes up a single thread that is waiting on this object's monitor.
(
"
"
Wakes up all threads that are waiting on this object's monitor.
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
27
API Zusammenfassung (3)
"
"
"
A thread group represents a set of threads. In addition, a thread group can also include other thread groups.
"
( =
"
Returns an estimate of the number of active threads in this thread group.
"
#
@A
"
Copies into the specified array every active thread in this thread group and its subgroups.
"
#
@A
"
"
Copies into the specified array every active thread in this thread group.
"!
! 7 6
"
Returns the maximum priority of this thread group.
! 6
"
Returns the parent of this thread group.
(
"
"
Interrupts all threads in this thread group.
(
"
D #
#
"
Changes the daemon status of this thread group.
(
"
7 6
"
Sets the maximum priority of the group.
(
"
!
"
"
Called by the Java Virtual Machine when a thread in this thread group stops because of an uncaught
exception.
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
28
Literatur
Java Tutorial, Multithreading,
http://java.sun.com/docs/books/tutorial/essential/threads/index.html
Horstmann, Cornell, Core Java 2, Band 2 - Expertenwissen, Markt und Technik, 2002:
Kapitel 1
Krüger, Handbuch der Java-Programmierung, 3. Auflage, Addison-Wesley, 2003,
http://www.javabuch.de: Kapitel 22
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
29
Programmbeispiele
Erzeugen, Starten, Ablauf von Threads:
Core Java 2: (<
-+
+
(
Scheduling und Prioritäten:
Core Java 2: (<
-+
+
(
+
(
Synchronisation:
Core Java 2: (<
-+B
3
Downloads:
Die Beispiele zu Core Java 2 können von
http://www.horstmann.com/corejava.html
heruntergeladen werden
Die Beispiele aus Handbuch der Java-Programmierung können von
http://www.javabuch.de
heruntergeladen werden
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
30
Herunterladen