Autor: Christian Seemann
Fach: Informatik - Programmierung
Details
Institution/Hochschule: Martin-Luther-Universität Halle-Wittenberg (Wirtschaftswissenschaftliche Fakultät)
Tags: Java, Threads, Seminar, Threads
Jahr: 2005
Seiten: 30
Note: 1,0
Literaturverzeichnis: ~ 10 Einträge
Sprache: Deutsch
Dateigröße: 1145 KB
ISBN (E-Book): 978-3-638-40004-6
Textauszug (computergeneriert)
Java Threads
von: Christian Seemann
9. Semester
Inhaltsverzeichnis
1 Motivation und Zielsetzung 5
2 Begriffsdefinitionen 6
3 Prinzipielle Möglichkeiten der Threadimplementierung in Java 7
4 Der Lebenszyklus eines Threads in Java 9
4.1 Ein Lebenszyklusmodell 9
4.2 Erzeugen eines Threads 10
4.3 Starten und Ausführen eines Threads 11
4.4 Deaktivieren eines Threads 12
4.5 Aktivieren eines Threads 14
4.6 Beenden eines Threads 15
4.7 Weitere Methoden der Klasse Thread 18
5. Synchronisation von Java Threads 20
5.1 Basiskonzepte für die Synchronisation von Java Threads 20
5.2 Synchronisation durch Semaphoren 25
6. Erweiterungen der Basisbibliotheken durch das Package java.util.concurrent 28
7. Ausblick 30
Literaturverzeichnis 31
1 Motivation und Zielsetzung
Die von Sun Microsystems entwickelte Programmiersprache Java wurde 1995 erstmals der Öffentlichkeit vorgestellt. Java wurde mit dem Ziel entwickelt, den Herausforderungen der Applikationsentwicklung in einer heterogenen, verteilten Umgebung erfolgreich zu begegnen. 1 Heute nutzen mehr als 3 Millionen Entwickler das Potenzial dieser Programmiersprache, die sich als De- facto-Standard für Network- Computing-Anwendungen etabliert hat.2 Als ein wesentliches Designziel für die Programmiersprache selbst, kann die Multithreadingfähigkeit angeführt werden. Sie soll es ermöglichen, mehrere Aktivitäten auf einem System gleichzeitig auszuführen, um ein ho hes Maß an Interaktivität für den Endnutzer zu sichern. 3 Die Nutzung von Threads rückte durch die zunehmende Verbreitung graphischer Interfaces in multitaskingfähigen Betriebssystemen in den Blickpunkt vieler Entwickler und wurde deshalb von Anfang an in Java integriert.4 Die zukünftigen Potenziale der parallelen Programmierung werden sich mit kostengünstigen Multiprozessormaschinen noch verfielfachen. Alle von Sun Microsystems zur Verfügung gestellten Java Basissystembibliotheken sind heute schon „thread safe“ implementiert und können deshalb die Korrektheit ihrer Funktionalität auch bei einem Einsatz mehrerer Threads sicherstellen. 5
Ziel dieser Seminararbeit soll die Darstellung und Dokumentation der Threadfähigkeiten der Programmiersprache Java sein. Im Mittelpunkt werden dabei die von Java zur Verfügung gestellten Basisfunktionalitäten für die parallele Programmierung stehen. Threadgruppen (insbesondere die Klasse ThreadGroup) sind außen vorgelassen. Neben verbalen Erläuterungen unterstützen entsprechende Codebeispiele die Ausführungen exemplarisch.
2 Begriffsdefinitionen
Ein Thread soll im Folgenden als sequentieller Kontrollfluss von Anweisungen innerhalb eines Programms betrachtet werden. 6 Dabei kann ein Programm mehrere Threads beinhalten. Jeder Thread führt seine Anweisungen unabhängig von anderen Threads aus, es sei denn eine Kooperation zwischen Threads wird gestartet. Ein Thread hat exklusive Zugriffsrechte auf die ihm zugeordneten lokalen Variablen. Sollten zwei Threads die gleiche Methode aus führen, wird jeweils eine separate Kopie der lokalen Variablen der Methode angefertigt. Objekte und Instanzvariablen können aber auch bei entsprechender Berechtigung von mehreren Threads gemeinsam genutzt werden. Die mit dem Schlüsselwort static gekennzeichneten Variablen stehen allen Threads automatisch zur Verfügung. 7
Multithreading bezeichnet die Fähigkeit eines Programms, mehrere Threads gleichzeitig abzuarbeiten. Abbildung 1 zeigt exemplarisch die Steuerung mehrerer Threads durch die Java Virtual Machine (JVM).
Abbildung 1- Steuerung mehrerer Threads durch die Java Virtual Machine8 [Abbildung in der Downloaddatei vorhanden]
Eine sog. Synchronisation von Threads vermeidet die Ausführung zweier oder mehrerer Threads zur gleichen Zeit. Mit Hilfe sog. Locks wird es möglich, Objekte oder Klassen zu verschließen, sodass sie [temporär] nur noch von einem Thread genutzt werden können. Insbesondere bei der Manipulation von Datenstrukturen wird diesem Konzept eine hohe Bedeutung beigemessen.
3 Prinzipielle Möglichkeiten der Threadimplementierung in Java
Dieses Kapitel soll zunächst die prinzipiellen Möglichkeiten der Nutzung von Threads in Java vorstellen. Java stellt zwei Optionen zur Verfügung um Threads zu implementieren:
· Vererbung von der Klasse java.lang.Thread
· Implementierung des Interfaces java.lang.Runnable
Im Kontext der Vererbung von der Klasse java.lang.Thread wird das Überschreiben der leeren Methode run() notwendig, um die Aufgaben des Threads zu implementieren. Die Methode public void start() lässt die Ausführung eines Threads beginnen. Die JVM ruft in diesem Zusammenhang die Methode public void run() des Threads auf. Codelisting 1 zeigt die eben geschilderte Möglichkeit der Threadimplementierung. Da Java jedoch konzeptionell keine Mehrfachvererbung unterstützt, existiert ebenso die Möglichkeit, Threads über das Interface java.lang.Runnable zu nutzen. Die das Interface implementierende Klasse muss die public void run() Methode überschreiben, um die Aufgaben des Threads festzulegen. Mit public void start() wird der Thread wie schon bei der Variante der Vererbung von der Klasse java.lang.Thread gestartet. Somit kann zusätzlich – neben der Einbindung der eigentlichen Multithreadfähigkeit – von einer anderen Klasse weitere Funktionalität geerbt werden. Codelisting 2 veranschaulicht die Implementierung des Interfaces java.lang.Runnable.
4 Der Lebenszyklus eines Threads in Java
Threads können sich in unterschiedlichen Zuständen befinden. Dieses Kapitel gibt zunächst an Hand eines Modells Aufschluss über den Lebenszyklus eines Threads in Java. Im Anschluss werden die einzelnen Zustandsübergänge detailliert erläutert.
4.1 Ein Lebenszyklusmodell
Mit der Java Version 1.5 wurde die Methode public Thread.state getState() eingeführt, mit der der aktuelle Zustand eines Threads ermittelt werden kann. Abbildung 2 zeigt neben allen Zuständen eines Threads in Java auch die für einen Zustandswechsel verantwortlichen Methoden bzw. Ereignisse. In Java wird nicht zwischen dem Zustand „runnable“ und „running“ unterschieden, da der Scheduler des Betriebssystems über die tatsächliche Ausführung des Threads entscheidet.
Abbildung 2 - Lebenszyklusmodell für einen Thread in Java [Abbildung in der Downloaddatei vorhanden]
4.2 Erzeugen eines Threads
[...]
1 Vgl. Gosling / McGilton (1996), S. 11
2 Vgl. Sun Microsystems, (2005)
3 Vgl. Gosling / McGilton (1996), S. 14f
4 Vgl. Oaks / Wong (1999), S. 9
5 Vgl. Gosling / McGilton (1996), S. 15
6 Vgl. Sun Microsystems 2 (2005)
7 Vgl. Oaks / Wong (1999), S. 5f
8 ebenda, 1999, S. 5
Kommentare
Dieser Text kann über folgende URL aufgerufen und zitiert werden: