Geschrieben von p3t3r am 07.02.2005, 22:29

1) Einführung:
Mit Hilfe von Threads kann man Parallelverarbeitung in Javaprogrammen realisieren. Ein Thread stellt einen eigenständigen Programmfaden dar, der parallel zu anderen Threads laufen kann. Java hat im Rahmen der OOP Threads direkt in die Sprache integriert, d.h. ein Thread ist eine Instanz der Klasse java.lang.Thread oder einer ihrer Subklassen. Sind mehrere Threads aktiv, so bekommmen sie vom sog. Threadscheduler der VM abwechselnd CPU-Zeit zugeteilt. Threads unterscheiden sich von Prozessen dadurch, dass sie auf einem gemeinsamen Datenraum operieren.

2) Erzeugung eines Threads:
Jeder Thread wird durch ein Objekt der Klasse java.lang.Thread oder einer ihrer Subklassen repräsentiert. Es gibt zwei Möglichkeiten um einen Thread zu erzeugen:
- Implementieren des Interfaces java.lang.Runnable
- Ableiten der Klasse java.lang.Thread

Interface java.lang.Runnable:
In der Methode run() ist Code zur Verfügung zu stellen, der nach dem Starten des Threads zur Ausführung kommt. Mit dem Ende der Methode run() ist auch das Ende des Threads erreicht. Zum Erzeugen eines Therads, der auf dem Interface Runnable basiert sind die folgende Schritte nötig:
- Eine Klasse implementiert das Interface java.lang.Runnable und konkretisiert die Methode run(). Diese Methode wird abgearbeitet, wenn der Thread gestartet wird.
- Ein Objekt der Klasse java.lang.Thread wird instanziiert. Dem Konstruktor wird ein Objekt jener Klasse übergeben, die das Interface Runnable implementiert.
- Die Methode start() der Klasse java.lang.Thread wird für das eben erzeugte Threadobjekt aufgerufen. Diese Methode versetzt den Thread in einen Zustand, der es ihm ermöglicht, seine Methode run()auszuführen. Dies muss nicht sofort erfolgen, da unter Umständen Threads höherer Priorität zuerst ausgeführt werden. Bei der Durchführung der obigen Schritte sind die folgenden Methoden der Klasse java.lang.Thread wesentlich:

public Thread(Runnable target)
Erzeugt ein neues Threadobjekt. Nach Starten dieses Threads wird die Methode run() von target ausgeführt.

public Thread(Runnable target, String name)
Wie oben, es kann zusätzlich ein Name für den Therad vergeben werden.

Im folgenden Beispiel werden zwei Threads erzeugt und gestartet, wobei jeder in einer Schleife eine Instanzvariable von 1 bis 10 hochzählt und ausgibt.

Beispiel:
class Counter implements Runnable {
private int z;
private int nr;

public Counter(int nr) {
this.nr = nr;
}

public void run() {
for (z = 1; z <=10; z++)
System.out.println("Thread " + nr + ": " + z);
}
}

public class Threads_1 {
public static void main(String[] args) {
Thread t1 = new Thread(new Counter(1));
Thread t2 = new Thread(new Counter(2));
t1.start();
t2.start();
}
}

->Mögliche Ausgabe:
Thread 1: 1
Thread 1: 2
...
Thread 2: 9
Thread 2: 10
Thread 1: 9
Thread 1: 10

In obigem Beispiel ist wesentlich, dass die beiden Threads t1.start und t2.start über die Methode start() gestartet werden. Ein Aufruf von run() ist an dieser Stelle zwar möglich, man erhält aber in diesem Fall keine Parallelverarbeitung, sondern ruft zweimal
die leere Methode run() der Klasse java.lang.Thread auf.
Diese Methode der Threaderzeugung kommt immer dann zum Einsatz, wenn Ableiten von java.lang.Thread nicht möglich ist, da von einer anderen Klasse abgeleitet werden muss.

Ableiten der Klasse Thread:
Ein Thread kann auch erzeugt werden, indem man von der Klasse Thread ableitet. Diese Klasse implementiert das Interface java.lang.Runnable und konkretisiert die Methode run() mit leerem Methodenrumpf. Auch hier erfolgt die Threaderzeugung in 3 Schritten:
- Eine Klasse wird von Thread abgeleitet und die Methode run() wird überlagert.
- Ein Objekt dieser neuen Klasse wird angelegt.
- Die von Thread geerbte Methode start() wird für das eben erzeugte Threadobjekt aufgerufen. Diese Methode versetzt den Thread in einen Zustand, der es ihm ermöglicht, seine Methode run() als eigenen Thread auszuführen.

Bewertung Anzahl
6
75,0 %
6 Bewertungen
1
25,0 %
2 Bewertungen