„Hallo Amigo! Hier ist eine interessante Frage, die du dir entweder schon gestellt hast oder bald stellen wirst. Wie stoppt man einen laufenden Thread?"

Nehmen wir an, der Benutzer weist das Programm an, eine Datei aus dem Internet herunterzuladen. Der Haupt-Thread erstellt einen separaten untergeordneten Thread für diesen Auftrag und übergibt ihm ein Objekt, dessen run-Methode alle notwendigen Aktionen zum Herunterladen der Datei enthält.

Doch plötzlich ändert der Benutzer seine Meinung. Er will die Datei doch nicht herunterladen. Wie brechen wir einen Auftrag ab und stoppen den Thread?

„Ja, sag mir wie.“

Wir können es nicht. Das ist die geläufigste und korrekteste Antwort. Du kannst einen Thread nicht stoppen. Nur der Thread selbst kann das.

Aber du kannst ein Signal an einen Thread senden, das ihm in gewisser Weise mitteilt, dass die Arbeit nicht mehr ausgeführt werden muss und dass er sich beenden soll. Genauso wie der Haupt-Thread durch die Rückkehr aus der main-Methode beendet wird, wird ein untergeordneter Thread durch die Rückkehr aus der run-Methode beendet.

„Wie macht man das am besten?“

„Du kannst eine Variable hinzufügen, z.B. ein boolean. Wenn es true ist, läuft der Thread. Wenn es false ist, muss der Thread beendet werden. So zum Beispiel:“

Code Beschreibung
class Clock implements Runnable
{
public void run()
{
while (true)
{
Thread.sleep(1000);
System.out.println("Tick");

if (!ClockManager.isClockRun)
return;
}
}
}

Die Clock-Klasse schreibt für immer einmal pro Sekunde „Tick“ auf die Konsole

Wenn ClockManager.isClockRun false ist, wird die run-Methode beendet.

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

Thread.sleep(10000);
isClockRun = false;
}

}
Der Haupt-Thread startet einen untergeordneten Thread (clock), der für immer laufen soll

Warte 10 Sekunden und gib der Uhr ein Signal zum Beenden.

Der Haupt-Thread schließt seine Arbeit ab.

Der clock-Thread beendet seine Arbeit.

„Was ist, wenn wir mehrere Threads haben?“

„Am besten hat man eine solche Variable für jeden Thread. Am praktischsten ist es, sie direkt in die Klasse einzufügen. Du könntest dort die Variable boolean isRun hinzufügen. Besser ist es aber, die Variable boolean isCancel hinzuzufügen, die true wird, wenn die Aufgabe abgebrochen wird.“

Code Beschreibung
class Clock implements Runnable
{
private boolean isCancel = false;

public void cancel()
{
this.isCancel = true;
}

public void run()
{
while (!isCancel)
{
Thread.sleep(1000);
System.out.println("Tick");
}
}
}
Die Clock-Klasse schreibt das Wort „Tick“ einmal pro Sekunde auf die Konsole, solange isCancel false ist.

Wenn isCancel 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);
clock.cancel();
}
Der Haupt-Thread startet einen untergeordneten Thread (clock), der für immer laufen soll

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

Der Haupt-Thread schließt seine Arbeit ab.

Der clock-Thread beendet seine Arbeit.

„Das werde ich mir merken. Danke, Ellie.“