Falls es in einer Anwendung erforderlich ist, einen Thread anzuhalten, dessen Rumpf aus einer Schleife besteht, soll stattdessen folgendes Muster angewendet werden:
- Beim Start wird eine Referenz auf den Thread ermittelt.
- Zum Anhalten wird diese Referenz auf null gesetzt.
- In der Hauptschleife des Threads wird vor jedem Durchgang geprüft, ob diese Referenz noch auf den Thread selbst verweist. Nur wenn das der Fall ist, wird die Schleife betreten. Wenn die Referenz den Wert null hat oder bereits auf einen anderen Thread verweist, der in der Zwischenzeit neu erzeugt wurde, beendet der Thread seine Ausführung durch das Verlassen der Schleife.
Der folgende Auszug stammt aus dem Laufschrift-Applet aus dem Grafikkapitel und zeigt, wie dieses Muster implementiert wird.
public class ScrollTextDemo1
extends Applet implements Runnable {
...
public void start() {
if (t == null) { // Wenn kein Thread angelegt ist
t = new Thread(this); // Anlegen und Starten des Threads
t.start();
}
}
public void stop() {
t = null; // dereferenzieren
}
public void run() {
Thread me = Thread.currentThread();
while(me == t) {
if (x < -textwidth) // Text am Ende des Applets?
x = getSize().width; // wieder zum Anfang
else // sonst
x = x - STEP; // um 'STEP' versetzen
repaint(); // Text neu zeichnen
try {
t.sleep(DELAY); // Verzögerung
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}