11.3.2 | Anhalten von Threads |
Zum Anhalten von Threads konnte man bis zur Version 1.1 einfach die Methode Thread.stop() aufrufen. Da sich aber herausgestellt hat, dass das Beenden von Threads mitten im Ablauf in einigen Situationen problematisch ist, beispielsweise während ein Thread einen Monitor besitzt, wurde Thread.stop() seit Version 1.2 verworfen.
Falls es in einer Anwendung erforderlich ist, einen Thread anzuhalten, dessen Rumpf aus einer Schleife besteht, soll stattdessen folgendes Muster angewendet werden:Der folgende Auszug stammt aus dem Laufschrift-Applet aus dem Grafikkapitel und zeigt, wie dieses Muster implementiert wird.
- 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.
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(); } } } }