Interrupt-Methode
Interrupt bedeutet wörtlich „Unterbrechen“, aber in Java benachrichtigt die Thread.interrupt()-Methode den Thread tatsächlich auf irgendeine Weise und beendet ihn nicht direkt. Es liegt an der Person, die den Code geschrieben hat, zu entscheiden, was zu tun ist, und normalerweise brechen wir den Thread ab.
Wenn der Thread die Methoden „wait()“, „wait(long)“ oder „wait(long, int)“ der Klasse „Object“ oder die Methoden „join()“, „join(long“), „join(long, int“), „sleep(long)“ oder „aufruft“. Der Ruhezustand der Klasse (long, int) wird während der Methode blockiert, ihr Interrupt-Status wird gelöscht und sie erhält außerdem eine InterruptedException.
Wenn der Thread einen E/A-Vorgang auf einem unterbrechbaren Kanal (java.nio.channels.InterruptibleChannel) blockiert, wird der Kanal geschlossen, der Interrupt-Status des Threads gesetzt und der Thread erhält eine ClosedByInterruptException.
Wenn der Thread in einem Selector (java.nio.channels.Selector) blockiert ist, wird der Interrupt-Status des Threads festgelegt und er kehrt sofort von der Select-Operation zurück, möglicherweise mit einem Wert ungleich Null, als ob Select als Wakeup bezeichnet würde Die Methode des Geräts ist dieselbe.
Wenn keine der vorherigen Bedingungen gespeichert wurde, wird der Interrupt-Status des Threads gesetzt.
Das Unterbrechen eines inaktiven Threads hat keine Auswirkung.
Interrupt erkennen
Wie der Interrupt erkannt wird, hängt davon ab, was der Thread tut.
Wenn der Thread eine Methode aufruft, die InterruptException auslösen kann, fangen Sie die InterruptException ab und behandeln Sie sie dann im Catch-Block (in der Regel beenden Sie die Ausführungsmethode, um den Thread zu unterbrechen).
Wenn Sie andere Methoden aufrufen, können Sie Thread.interrupted im Leerlauf überprüfen, um festzustellen, ob ein Interrupt-Signal empfangen wurde, und es verarbeiten, nachdem Sie bestätigt haben, dass das Interrupt-Signal empfangen wurde. Um mit der vorherigen Behandlungsmethode konsistent zu sein, kann eine InterruptException ausgelöst werden
Interrupt-Status
Der Interrupt-Mechanismus des Threads wird mithilfe des internen Flags des Interrupt-Status implementiert. Der Interrupt-Status wird festgelegt, wenn die Interrupt()-Methode des Threads aufgerufen wird (siehe Beschreibung der Interrupt-Methode oben).
Es gibt zwei Möglichkeiten, den Interrupt-Status eines Threads abzurufen:
Rufen Sie die statische Methode Thread.interrupted() auf. Zusätzlich zur Rückgabe des Interrupt-Status des aktuellen Threads löscht diese Methode auch den Interrupt-Status des aktuellen Threads. Mit anderen Worten: Wenn diese Methode zweimal hintereinander aufgerufen wird, gibt der zweite Aufruf false zurück (nachdem der erste Aufruf seinen Unterbrechungsstatus gelöscht hat und bevor der zweite Aufruf den Unterbrechungsstatus überprüft hat, wird der aktuelle Thread erneut unterbrochen. Ausnahmen ).
Rufen Sie die isInterrupted()-Methode des angegebenen Threads auf. Diese Methode gibt nur den Interrupt-Status des angegebenen Threads zurück, ohne den Interrupt-Status des Threads zu beeinflussen.
Es gibt zwei Möglichkeiten, den Interrupt-Status eines Threads zu löschen:
Wie oben erwähnt, wird Thread.interrupted() aufgerufen
Wenn die Interrupt()-Methode des Threads aufgerufen wird, um InterruptedException zu verursachen, wird gleichzeitig der Interrupt-Status des Threads gelöscht, einschließlich der Wait()-, Wait(long)- oder Wait(long, int)-Methode des Objekts -Klasse oder die Methode „join()“, „join(long)“, „join(long, int)“, „sleep(long)“ oder „sleep(long, int)“ des Threads