11.3.1 | Erzeugen und Starten von Threads |
Es gibt zwei Möglichkeiten, Code einer Klasse als Thread auszuführen:Mit beiden Varianten erhält man schließlich eine Referenz vom Typ Thread (bzw. einer Unterklasse), über die man alle Methoden von Thread aufrufen kann, um den Thread zu steuern.
- Man leitet eine Klasse von Thread ab und überschreibt die Methode run(). Zum Erzeugen eines Threads wird wie bei normalen Erzeugungen auch ein Konstruktor der abgeleiteten Klasse aufgerufen. Diese Technik wurde in den Beispielen am Beginn des Kapitels verwendet.
- Die zweite und vorzuziehende Möglichkeit besteht darin, dass die Klasse das Interface Runnable implementiert und dessen Methode run() überschreibt. Das Erzeugen eines Threads erfolgt hier in zwei Stufen: Zunächst wird ein Exemplar der Klasse erzeugt. Dieses wird dann dem Konstruktor Thread(Runnable) übergeben. Diese Technik erlaubt es, beliebige Klassen als Thread auszuführen, auch dann, wenn sie bereits von einer anderen Klasse abgeleitet sind. Runnable wird häufig bei Applets eingesetzt, da sie von der Klasse Applet abgeleitet sind und aufgrund der fehlenden Mehrfachvererbung in Java nicht noch zusätzlich von Thread abgeleitet werden können. Meist wird folgendes Muster angewendet (ein weiteres Beispiel befindet sich im nächsten Abschnitt):
public class MultiThreadedApplet extends Applet implements Runnable { public void run() { // enthält den Code, der vom Thread // ausgeführt werden soll. } public void start() { Thread appletThread; appletThread = new Thread(this); appletThread.start(); } }
Falls keine Referenz auf den erzeugten Thread benötigt wird, kann man das Erzeugen des Threads und das Starten auch kompakter formulieren, was in unserem Beispiel folgendermaßen aussehen würde:new Thread(this).start();