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. Heute nutzen mehr als 3 Millionen Entwickler das Potenzial dieser Programmiersprache, die sich als De-facto-Standard für Network-Computing-Anwendungen etabliert hat.
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 hohes Maß an Interaktivität für den Endnutzer zu sichern. 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. 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.
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.
Inhaltsverzeichnis
Übersichtsverzeichnis
Verzeichnis der Codelistings
1 Motivation und Zielsetzung
2 Begriffsdefinitionen
3 Prinzipielle Möglichkeiten der Threadimplementierung in Java
4 Der Lebenszyklus eines Threads in Java
4.1 Ein Lebenszyklusmodell
4.2 Erzeugen eines Threads
4.3 Starten und Ausführen eines Threads
4.4 Deaktivieren eines Threads
4.5 Aktivieren eines Threads
4.6 Beenden eines Threads
4.7 Weitere Methoden der Klasse Thread
5. Synchronisation von Java Threads
5.1 Basiskonzepte für die Synchronisation von Java Threads
5.2 Synchronisation durch Semaphoren
6. Erweiterungen der Basisbibliotheken durch das Package java.util.concurrent
7. Ausblick
Literaturverzeichnis
Übersichtsverzeichnis
Abbildung 1- Steuerung mehrerer Threads durch die Java Virtual Machine
Abbildung 2 - Lebenszyklusmodell für einen Thread in Java
Tabelle 1 - Weitere Methoden der Klasse Thread im Überblick
Verzeichnis der Codelistings
Codelisting 1 – Vererbung von der Klasse java.lang.Thread
Codelisting 2 - Implementierung des Interfaces Runnable
Codelisting 3 - Demonstration der Methode join()
Codelisting 4 – Beendigung eines laufenden Threads
Codelisting 5 - Ein Konsumenten/Produzenten Beispiel
Codelisting 6 - Detaillierung der angedeuteten Methoden aus Codelisting 5
Codelisting 7 - Implementierung einer Semaphore
Codelisting 8 - Ein Konsumenten/Produzenten Szenario mit Hilfe einer Semaphore
Codelisting 9 - Detaillierung der Methoden produce, consume und print
Codelisting 10 - Implementierung eines CubbyHoles mittels Locks
Codelisting 11 - Detaillierung der Methoden get und put
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 hohes 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 Thread-fä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 ausfü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 in dieser Leseprobe nicht enthalten
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.
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.
Abbildung in dieser Leseprobe nicht enthalten
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 einer anderen Klasse weitere Funktionalität geerbt werden. Codelisting 2 veranschaulicht die Implementierung des Interfaces java.lang.Runnable.
Abbildung in dieser Leseprobe nicht enthalten
Codelisting 2 - Implementierung des Interfaces 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 in dieser Leseprobe nicht enthalten
Abbildung 2 - Lebenszyklusmodell für einen Thread in Java
[...]
[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
- Arbeit zitieren
- Christian Seemann (Autor:in), 2005, Erstellung und Synchronisation von Java Threads, München, GRIN Verlag, https://www.grin.com/document/41815
-
Laden Sie Ihre eigenen Arbeiten hoch! Geld verdienen und iPhone X gewinnen. -
Laden Sie Ihre eigenen Arbeiten hoch! Geld verdienen und iPhone X gewinnen. -
Laden Sie Ihre eigenen Arbeiten hoch! Geld verdienen und iPhone X gewinnen. -
Laden Sie Ihre eigenen Arbeiten hoch! Geld verdienen und iPhone X gewinnen. -
Laden Sie Ihre eigenen Arbeiten hoch! Geld verdienen und iPhone X gewinnen. -
Laden Sie Ihre eigenen Arbeiten hoch! Geld verdienen und iPhone X gewinnen. -
Laden Sie Ihre eigenen Arbeiten hoch! Geld verdienen und iPhone X gewinnen. -
Laden Sie Ihre eigenen Arbeiten hoch! Geld verdienen und iPhone X gewinnen. -
Laden Sie Ihre eigenen Arbeiten hoch! Geld verdienen und iPhone X gewinnen.