Inhaltsverzeichnis
Übersichtsverzeichnis 4
Verzeichnis der Codelistings 4
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
Übersichtsverzeichnis
Abbildung 1 Steuerung mehrerer Threads durch die Java Virtual Machine 6
Abbildung 2 Lebenszyklusmodell für einen Thread in Java 9
Tabelle 1 Weitere Methoden der Klasse Thread im Überblick 19
Verzeichnis der Codelistings
Codelisting 1 Vererbung von der Klasse java lang Thread 7
Codelisting 2 Implementierung des Interfa ces Runnable 8
Codelisting 3 Demonstration der Methode join() 14
Codelisting 4 Beendigung eines laufenden Threads 17
Codelisting 5 Ein Konsumenten Produzenten Beispiel 23
Codelisting 6 Detaillierung der angedeuteten Methoden aus Codelisting 5 24
Codelisting 7 Implementierung einer Semaphore 25
Codelisting 8 Ein Konsumenten Produzenten Szenario mit Hilfe einer Semaphore 26
Codelisting 9 Detaillierung der Methoden produce consume und print 27
Codelisting 10 Implementierung eines CubbyHoles mittels Locks 29
Codelisting 11 Detaillierung der Methoden get und put 30
- 5 -
1Motivation 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.
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 -
2Begriffsdefinitionen
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 Machine 8
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.
6 Vgl. Sun Microsystems 2 (2005)
7 Vgl. Oaks / Wong (1999), S. 5f
8 ebenda, 1999, S. 5
- 7 -
3Prinzipielle 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
• Implement ierung 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.
Codelisting 1 – Vererbung von der Klasse java.lang.Thread
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
- 8 -
einer anderen Klasse weitere Funktionalität geerbt werden. Codelisting 2
veranschaulicht die Implementierung des Interfaces java.lang.Runnable.
Codelisting 2 - Implementierung des Interfaces Runnable
- 9 -
4Der 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.
Arbeit zitieren:
Christian Seemann, 2005, Java Threads, München, GRIN Verlag GmbH
Dieser Text kann über folgende URL aufgerufen und zitiert werden:
Einbetten
DOI
Multi-Projektmanagement: Bedeutung, Methoden und Techniken
BWL - Unternehmensführung, Management, Organisation
Hausarbeit, 14 Seiten
RFID - Chancen, Risiken und Umsetzungen einer Technologie
BWL - Beschaffung, Produktion, Logistik
Hausarbeit, 31 Seiten
Christian Seemann hat den Text Java Threads veröffentlicht
Christian Seemann hat einen neuen Text hochgeladen
Thread- und Netzwerk-Programmierung mit Java
Praktikum für die Parallele Pr...
Heinz Kredel, Akitoshi Yoshida
John Carnell, Todo Lauinger, Kevin Mukhar, Seven. Servicios editoriales
0 Kommentare