„Hallo Amigo! Du musst zugeben, dass Ellies Idee zum Abbrechen eines Threads brillant war.“

„So ist es.“

„Tatsächlich ist in der Thread-Klasse etwas ähnliches zu finden. Nur dass die Variable nicht isCancel heißt. Sie heißt isInterrupt. Und die Methode, die zum Stoppen des Threads verwendet wird, ist nicht cancel(). Es ist interrupt().“

„Wirklich?“

„Ja. Sieh es dir an:“

Code Beschreibung
class Clock implements Runnable
{
public void run()
{
Thread current = Thread.currentThread();

while (!current.isInterrupted())
{
Thread.sleep(1000);
System.out.println("Tick");
}
}
}
Da mehrere Threads die run-Methode mit dem gleichen Clock-Objekt aufrufen können, erhalten wir das Thread-Objekt für den aktuellen Thread.

Die Clock-Klasse schreibt das Wort „Tick“ einmal pro Sekunde auf die Konsole, solange die Variable isInterrupt des aktuellen Threads false ist.

Wenn isInterrupt true wird, bricht die run-Methode ab.

public static void main(String[] args)
{
Clock clock = new Clock();
Thread clockThread = new Thread(clock);
clockThread.start();

Thread.sleep(10000);
clockThread.interrupt();
}
Der Haupt-Thread startet einen untergeordneten Thread (clock), der für immer laufen soll.

Warte 10 Sekunden und brich die Aufgabe durch Aufruf der interrupt-Methode ab.

Der Haupt-Thread schließt seine Arbeit ab.

Der clock-Thread beendet seine Arbeit.

Außerdem überprüft die sleep-Methode, die so gerne in Endlosschleifen in der run-Methode verwendet wird, automatisch die isInterrupt-Variable. Wenn ein Thread die sleep-Methode aufruft, prüft die Methode zunächst, ob isInterrupt für diesen Thread true ist. Wenn sie true ist, wird die Methode nicht einschlafen. Stattdessen löst sie die Ausnahme InterruptedException aus.

„Warum löst sie eine Ausnahme aus? Wäre es nicht besser, einfach isInterrupted() anstelle von isCancel() in eine Schleife zu setzen?“

Erstens hat die run-Methode nicht immer eine Schleife. Die Methode könnte auch einfach aus ein paar Dutzend Aufrufen anderer Methoden bestehen. Dann musst du vor jedem Methodenaufruf eine Prüfung für isInterrupted hinzufügen.“

Zweitens kann eine Methode, die viele verschiedene Aktionen umfasst, eine sehr lange Ausführungsdauer haben.“

Drittens ersetzt das Auslösen einer Ausnahme nicht die isInterrupted-Prüfung. Es ist nur eine praktische Ergänzung. Mit der ausgelösten Ausnahme kannst du schnell den Stacktrace zurück zur run-Methode selbst auflösen.“

Viertens wird die sleep-Methode sehr oft eingesetzt. Wie sich zeigt, wird diese hilfreiche Methode durch eine implizite Prüfung ergänzt, die nicht weniger hilfreich ist. Es ist, als hätte niemand die Prüfung ausdrücklich hinzugefügt, aber sie ist trotzdem da. Das ist äußerst nützlich, wenn du den Code eines anderen benutzt und du die Prüfung nicht selbst hinzufügen kannst.“

Fünftens beeinträchtigt die zusätzliche Prüfung die Leistung überhaupt nicht. Der Aufruf der sleep-Methode bedeutet, dass der Thread nichts tun muss (außer schlafen), so dass die zusätzliche Arbeit niemanden stört.“

„Das sind überzeugende Argumente.“

„Und schließlich noch das hier: Deine run-Methode kann den Code eines anderen aufrufen, auf den du keinen Zugriff hast (Quellcode und/oder Rechte zur Änderung des Codes). Möglicherweise hat er keine isInterrupted-Prüfungen, und er könnte „try ... catch (Exception e)„ verwenden, um alle Ausnahmen abzufangen.“

Niemand kann garantieren, dass ein Thread gestoppt wird. Nur ein Thread kann sich selbst stoppen.