„Hallo, Amigo!

„Alles Neue ist nur etwas Altes, das wir vergessen haben. Heute werde ich über das Stoppen von Threads sprechen. Ich hoffe, Sie haben bereits vergessen, wie die Methode interrupt() funktioniert.“

„Ja, Ellie, ich habe es völlig vergessen.“

„Großartig. Dann werde ich dich daran erinnern.“

„Wenn jemand in Java einen laufenden Thread stoppen möchte, kann er dies dem Thread signalisieren. Dazu müssen Sie die versteckte Variable isInterrupted des Thread-Objekts auf true setzen.“

„Jeder Thread verfügt über eine Interrupt()-Methode, mit der dieses Flag gesetzt wird. Wenn die Interrupt ()-Methode aufgerufen wird, wird die Variable isInterrupted im Thread-Objekt auf true gesetzt.“

„Und wenn die Thread.sleep()- oder join()-Methode für einen Thread aufgerufen wird, prüft die Methode, ob das isInterrupted-Flag für den aktuellen Thread gesetzt ist. Wenn dieses Flag gesetzt ist (die Variable isInterrupted ist gleich true), dann werden die Methoden wirf eine InterruptedException aus .“

„Hier erinnere ich Sie an ein altes Beispiel:“

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

while (!current.isInterrupted())
{
Thread.sleep(1000);
System.out.println("Tik");
}
}
}
Die run-Methode der Uhr ruft das Thread-Objekt für den aktuellen Thread ab.

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

Wenn isInterrupt wahr wird, wird die Ausführungsmethode beendet.

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

Thread.sleep(10000);
clockThread.interrupt();
}
Der Hauptthread startet einen untergeordneten Thread (Uhr), der ewig laufen sollte.

Warten Sie 10 Sekunden und brechen Sie die Aufgabe ab, indem Sie die Interrupt-Methode aufrufen.

Der Hauptthread beendet seine Arbeit.

Der Uhrenthread beendet seine Arbeit.

„Hier verwenden wir die Sleep- Methode als Teil einer Endlosschleife in der Run- Methode. In der Schleife wird die Variable isInterrupt automatisch überprüft. Wenn ein Thread die Sleep- Methode aufruft, prüft die Methode zunächst, ob isInterrupt für diesen Thread wahr ist (der eine, die die Sleep-Methode aufgerufen hat). Wenn es wahr ist, wird die Methode nicht in den Ruhezustand versetzt. Stattdessen wird eine InterruptedException ausgelöst .

„Aber in diesem Beispiel überprüfen wir ständig die Variable isInterrupted in der Schleifenbedingung.“

„Ich erinnere mich, dass es einige Gründe gab, warum wir diesen Ansatz nicht anwenden konnten. Können Sie mich daran erinnern?“

Erstens verfügt die run- Methode nicht immer über eine Schleife. Die Methode kann einfach aus ein paar Dutzend Aufrufen anderer Methoden bestehen. In diesem Fall müssten Sie vor jedem Methodenaufruf eine isInterrupted-Prüfung hinzufügen.“

Zweitens kann die Ausführung einiger Methoden mit vielen verschiedenen Aktionen sehr lange dauern.“

Drittens ersetzt das Auslösen einer Ausnahme nicht die Prüfung „isInterrupted “.

Viertens wird die Schlafmethode häufig verwendet. Es stellt sich heraus, dass diese hilfreiche Methode durch eine implizite Prüfung erweitert wird, die nicht weniger hilfreich ist. Es ist,  als ob niemand die Prüfung speziell hinzugefügt hätte, aber da ist sie.  Das ist sehr wertvoll, wenn Sie „Sie verwenden den Code einer anderen Person und Sie können den Scheck nicht selbst hinzufügen.“

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

„Das ist genau das, was Sie vorhin gesagt haben.“

„Und was ist mit Ihrer Aussage: „ Niemand kann garantieren, dass ein Thread gestoppt wird. Nur ein Thread kann sich selbst stoppen. “ Können Sie das erklären?“

"Sicher."

„Früher, in frühen Versionen von Java, hatten Threads eine stop()-Methode. Und wenn man sie aufrief, stoppte die JVM tatsächlich den Thread. Aber wenn ein Thread etwas außerhalb der JVM tat (z. B. in eine Datei schreiben oder aufrufen). Betriebssystemfunktionen), als es auf diese Weise unterbrochen wurde, verursachte die Unterbrechung viele Probleme, wie z. B. nicht geschlossene Dateien, nicht freigegebene Systemressourcen usw.

„Eine Generalversammlung der Java-Entwickler hat beschlossen, die Methode zum erzwungenen Stoppen von Threads zu entfernen. Jetzt können wir nur noch ein bestimmtes Flag (isInterrupted) setzen und hoffen, dass der Thread-Code korrekt geschrieben wurde, damit dieses Flag verarbeitet wird. Dieses Flag ist wie ein Schild, das sagt: „Einfädeln, bitte stoppen. Es ist sehr wichtig!“. Aber ob es aufhört oder nicht, ist seine eigene Sache.“

„Aber was ist mit der InterruptedException?“

„Was ist, wenn der Code, der in diesem Thread ausgeführt wird, eine Reihe von Try-Catch-Blöcken enthält? Selbst wenn irgendwo eine InterruptedException auftritt, gibt es definitiv keine Garantie dafür, dass irgendein Try-Catch sie nicht abfängt und vergisst. Es gibt also keine Garantien dafür Der Thread wird gestoppt.

„Eine weitere Sache ist, dass Threads bereits als eher Low-Level-Programmierung gelten. Aber darüber erzähle ich Ihnen das nächste Mal.“

„Du bist nicht Ellie – du bist Scheherazade!“

„Also, Amigo! Ist in der aktuellen Lektion alles klar?“

"Ja."

"Okay gut."