1. Interrupt Wissenspunkte
Die folgende Zusammenfassung basiert auf JDK8
Dieser Artikel wird Interrupt nicht vollständig erklären, sondern nur einige wichtigere Punkte auflisten. Für ein vollständiges Verständnis von Thread.inrupt können Sie die Referenzmaterialien sehen.
Hier sind einige neue Artikel, die dazu beitragen, Referenzen zu verstehen:
Nachdem die Interrupt -Methode aufgerufen wurde, wird das Interrupt -Flag für Threads im blockierten Zustand auf TRUE eingestellt. Ob auf Interrupts reagieren (wusste Änderungen in diesem Flag -Bit), hängt vom Design der API ab. JDKs blockierende IO -API, synchronisierte Synchronisationsblock und viele Methoden in der Sperre (ohne lockinterriptable) reagieren nicht auf Interrupts. Natürlich kann der anrufende Thread das Flag -Bit -Urteilsvermögen verwenden, um die von selbst entworfene API auf Interrupts zu reagieren.
Nachdem die Interrupt -Methode aufgerufen wurde, wird die InterruptedException ** in den Thread im Warte-/Timed_waiting -Status geworfen und das Interrupt -Flag -Bit falsch ** wird festgelegt. Zum Beispiel, nachdem der Thread Thread.sleep, Object.wait () aufruft.
Wenn der Thread nicht gestartet wurde (neu) oder beendet (beendet), hat das Aufrufen von Interrupt () keinen Einfluss darauf, und das Interrupt -Flag wird nicht festgelegt.
Best Practice: Manchmal dürfen einige Methoden im Design nicht unterbrochen oder abgesagt werden, aber wenn andere Themen Interrupt -Anfragen senden, müssen sie auch Marken aufbewahren, um andere Anrufer zu erleichtern, um "die Situation zu verstehen".
öffentliche Aufgabe getNextTask (Blockingqueue <Abum> Warteschlange) {boolean interbruptd = false; try {while (true) {try {return queue.take (); } catch (InterruptedException e) {// Die Abhängigkeitsstatusmarke in fianlly interrupted = true; // durchfallen und wiederholen}}} endlich {if (unterbrochen) // Bemerkung in fianlly, um sicherzustellen, dass kein fehlender Interrupt -Benachrichtigungs -Thread fehlt. }}Einige Absagevorgänge können mit Interrupts implementiert werden. Zum Beispiel:
Paket übereinstimmen; import Java.util.concurrent.Blockingqueue; Import Java.util.Concurrent public static void main (String [] args) löst InterruptedException {Interrupttask interrupttask = new Interrupttask () aus; ExecutorService ExecutorService = Executors.NewsingLethreadExecutor (); ExecutorService.Submit (InterruptTask); Thread.Sleep (100); interruptask.cancel (); ExecutorService.Shutdown (); }}/*** Eine Aufgabe, die auf Interrupt reagiert*/class Interrupttask implementiert CALLABLE <GanzEger> {private Blockingqueue <AbUt> Warteschlange; // Speichern Sie den zu unterbrochenen Thread t; @Override public Integer call () löscht InterruptedException {System.out.println ("eine blockierte Aufgabe starten"); try {t = thread.currentThread (); Thread.currentThread (). Schlaf (50000); } catch (InterruptedException e) {System.out.println ("unterbrochen"); E. printstacktrace (); } return 0; } public void cancel () {System.out.println ("Cacel a Aufgabe ...."); // Thread.currentThread () hier aufruft, erhält hier den Haupt -Thread und nicht den Thread im Thread -Pool if (! T.issinterrupt ()) {t.interrupt (); }}}Zusammenfassen
Das obige ist das Update in Java basierend auf dem vom Herausgeber eingeführten JDK8 -Zusammenfassung. Ich hoffe, es wird für alle hilfreich sein. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und der Editor wird allen rechtzeitig antworten. Vielen Dank für Ihre Unterstützung auf der Wulin.com -Website!