Warum die Methode Thread.currentThread.interrupt()
im catch-Block aufrufen ?
quelle
Warum die Methode Thread.currentThread.interrupt()
im catch-Block aufrufen ?
Dies geschieht, um den Zustand zu erhalten .
Wenn Sie das fangen InterruptException
und es schlucken, verhindern Sie im Wesentlichen, dass übergeordnete Methoden / Thread-Gruppen den Interrupt bemerken. Was zu Problemen führen kann.
Durch Aufrufen setzen Thread.currentThread().interrupt()
Sie das Interrupt-Flag des Threads, damit Interrupt-Handler höherer Ebenen es bemerken und es entsprechend behandeln können.
Java Concurrency in Practice beschreibt dies ausführlicher in Kapitel 7.1.3: Reagieren auf Unterbrechungen . Ihre Regel lautet:
Nur Code, der die Unterbrechungsrichtlinie eines Threads implementiert, kann eine Unterbrechungsanforderung verschlucken. Allzweck-Task und Bibliothekscode sollten niemals Unterbrechungsanforderungen verschlucken.
InterruptedException
löscht jede Methode, die durch Auslösen eines Interrupt-Status beendet wird, dies. Ich denke, dies macht die Antwort klarer, warum Sie den Interrupt-Status beibehalten müssen.interrupt()
Anruf ist der einzige Weg setzen die unterbrochene Flag , wenn Sie Benachrichtigung über diesen Zustand durch den anderen „Liefermechanismus“ erhalten - dasInterruptedException
wünscht oder nicht , es erneut zu werfen.Ich denke, dieses Codebeispiel macht die Dinge ein bisschen klar. Die Klasse, die den Job macht:
Die Hauptklasse:
Versuchen Sie, Interrupt aufzurufen, ohne den Status zurückzusetzen.
quelle
Hinweis:
http://download.oracle.com/javase/7/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html
Wie stoppe ich einen Thread, der lange wartet (z. B. auf Eingabe)?
Dadurch wird sichergestellt, dass der Thread die InterruptedException erneut aktiviert, sobald dies möglich ist.
quelle
Ich würde es als schlechte Praxis oder zumindest ein bisschen riskant betrachten. Normalerweise führen übergeordnete Methoden keine Blockierungsvorgänge aus und werden dort nie angezeigt
InterruptedException
. Wenn Sie es an jedem Ort maskieren, an dem Sie einen unterbrechbaren Betrieb ausführen, werden Sie es nie bekommen.Der einzige Grund dafür
Thread.currentThread.interrupt()
, dass keine andere Ausnahme oder Signalisierungsunterbrechungsanforderung auf andere Weise ausgelöst wird (z. B. Festlegen einerinterrupted
lokalen Variablenvariablen in der Hauptschleife eines Threads), ist die Situation, in der Sie mit der Ausnahme wirklich nichts tun können, wie in denfinally
Blöcken.Sehen Sie sich die Antwort von Péter Török an, wenn Sie die Auswirkungen des
Thread.currentThread.interrupt()
Anrufs besser verstehen möchten .quelle
Siehe Java-Dokument
Wenn Sie also die sleepBabySleep () -Methode in @Ajay George Answer to I / O-Operation oder nur ein Sysout ändern, müssen Sie den Status nicht zurücksetzen, um das Programm zu stoppen. (Übrigens werfen sie nicht einmal InterruptedException)
Genau wie @ Péter Török sagte => Dies geschieht, um den Zustand zu erhalten. (Und insbesondere für Methoden, die InterruptedException auslösen)
quelle