Können Sie erklären, was java.lang.Thread.interrupt()
beim Aufrufen geschieht?
java
multithreading
oneat
quelle
quelle
Antworten:
Thread.interrupt()
setzt den unterbrochenen Status / Flag des Ziel-Threads. Dann kann Code, der in diesem Zielthread ausgeführt wird, den unterbrochenen Status abfragen und entsprechend behandeln. Einige Methoden, die blockieren, wie z. B.,Object.wait()
können den unterbrochenen Status sofort verbrauchen und (normalerweiseInterruptedException
) eine entsprechende Ausnahme auslösen.Eine Unterbrechung in Java ist nicht präventiv. Anders ausgedrückt, beide Threads müssen zusammenarbeiten, um den Interrupt ordnungsgemäß zu verarbeiten. Wenn der Ziel-Thread den unterbrochenen Status nicht abfragt, wird der Interrupt effektiv ignoriert.
Das Abrufen erfolgt über die
Thread.interrupted()
Methode, die den unterbrochenen Status des aktuellen Threads zurückgibt UND dieses Interrupt-Flag löscht. Normalerweise kann der Thread dann beispielsweise InterruptedException auslösen.BEARBEITEN (aus Thilo-Kommentaren): Einige API-Methoden haben eine Interrupt-Behandlung eingebaut. Von der Oberseite meines Kopfes schließt dies ein.
Object.wait()
,Thread.sleep()
UndThread.join()
java.util.concurrent
StrukturenInterruptedException
, sondern verwendetClosedByInterruptException
.BEARBEITEN (der Vollständigkeit halber von @ thomas-pornins Antwort auf genau dieselbe Frage )
Eine Fadenunterbrechung ist eine sanfte Methode, um einen Faden anzutreiben. Es wird verwendet, um Fäden die Möglichkeit zu geben, sauber auszutreten , im Gegensatz dazu
Thread.stop()
eher wie das Schießen des Fadens mit einem Sturmgewehr.quelle
Was ist Interrupt?
Wie ist es implementiert?
Zitat aus der
Thread.interrupt()
API :Überprüfen Sie dies für ein vollständiges Verständnis darüber:
http://download.oracle.com/javase/tutorial/essential/concurrency/interrupt.html
quelle
Wenn der Ziel-Thread gewartet hat (durch Aufrufen
wait()
oder andere verwandte Methoden, die im Wesentlichen dasselbe tun, wie z. B.sleep()
), wird er unterbrochen, was bedeutet, dass er nicht mehr auf das wartet, worauf er gewartet hat, und stattdessen eine InterruptedException empfängt.Es liegt ganz beim Thread selbst (dem aufgerufenen Code
wait()
), zu entscheiden, was in dieser Situation zu tun ist. Der Thread wird nicht automatisch beendet.Es wird manchmal in Kombination mit einem Beendigungsflag verwendet. Bei einer Unterbrechung könnte der Thread dieses Flag überprüfen und sich dann selbst herunterfahren. Aber auch dies ist nur eine Konvention.
quelle
Der Vollständigkeit halber zusätzlich zu den anderen Antworten, wenn der Faden , bevor er blockiert unterbrochen :
Object.wait(..)
oderThread.sleep(..)
usw. Dies entspricht es ist unmittelbar an diesem Verfahren unterbrochen wird bei der Blockierung , wie das folgende Beispiel zeigt.Ausgabe:
Implikation: Wenn Sie eine Schleife wie die folgende ausführen und der Interrupt genau zu dem Zeitpunkt auftritt, zu dem die Steuerung verlassen wurde
Thread.sleep(..)
und die Schleife umrundet, tritt die Ausnahme weiterhin auf. Es ist also absolut sicher, dass die InterruptedException nach dem Unterbrechen des Threads zuverlässig ausgelöst wird :quelle
Thread.interrupt()
setzt den unterbrochenen Status / Flag des Ziel-Threads auf true, was bei Überprüfung mitThread.interrupted()
dazu beitragen kann, den endlosen Thread zu stoppen. Siehe http://www.yegor256.com/2015/10/20/interrupted-exception.htmlquelle
Die Thread-Unterbrechung basiert auf dem Flag- Interrupt-Status . Für jeden Thread wird der Standardwert für den Interrupt-Status auf false gesetzt . Immer wenn die Interrupt () -Methode für einen Thread aufgerufen wird, wird der Interrupt-Status auf true gesetzt .
quelle
public void Interrupt ()
Unterbricht diesen Thread.
Sofern sich der aktuelle Thread nicht selbst unterbricht, was immer zulässig ist, wird die checkAccess-Methode dieses Threads aufgerufen, wodurch möglicherweise eine SecurityException ausgelöst wird.
Wenn dieser Thread bei einem Aufruf der Methoden wait (), wait (long) oder wait (long, int) der Object-Klasse oder der join (), join (long), join (long, int) blockiert ist. , sleep (long) oder sleep (long, int), Methoden dieser Klasse, dann wird ihr Interrupt-Status gelöscht und es wird eine InterruptedException empfangen.
Wenn dieser Thread in einer E / A-Operation auf einem unterbrechbaren Kanal blockiert wird, wird der Kanal geschlossen, der Interrupt-Status des Threads wird festgelegt und der Thread erhält eine ClosedByInterruptException.
Wenn dieser Thread in einem Selektor blockiert ist, wird der Interrupt-Status des Threads gesetzt und er kehrt sofort von der Auswahloperation zurück, möglicherweise mit einem Wert ungleich Null, so als ob die Aufweckmethode des Selektors aufgerufen worden wäre.
Wenn keine der vorherigen Bedingungen erfüllt ist, wird der Interrupt-Status dieses Threads festgelegt.
Das Unterbrechen eines Threads, der nicht aktiv ist, muss keine Auswirkungen haben.
Auslöser: SecurityException - Wenn der aktuelle Thread diesen Thread nicht ändern kann
quelle
Ein Interrupt ist ein Hinweis für einen Thread, dass er aufhören soll, was er tut, und etwas anderes tun soll. Es ist Sache des Programmierers, genau zu entscheiden, wie ein Thread auf einen Interrupt reagiert. Es kommt jedoch häufig vor, dass der Thread beendet wird. Eine sehr gute Referenz: https://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html
quelle
Die Methode Thread.interrupt () setzt das interne Flag 'Interrupt Status'. Normalerweise wird dieses Flag von der Thread.interrupted () -Methode überprüft.
Gemäß der Konvention muss jede Methode, die über InterruptedException existiert, das Interrupt-Status-Flag löschen.
quelle