Der Thread-Interrupt-Mechanismus ist der bevorzugte Weg, um einen (kooperierenden) Thread dazu zu bringen, auf eine Anfrage zu antworten, um zu stoppen, was er tut. Jeder Thread (einschließlich des Threads selbst, denke ich) könnte interrupt()
einen Thread aufrufen .
In der Praxis umfassen die normalen Anwendungsfälle interrupt()
eine Art Framework oder Manager, der einem Arbeitsthread sagt, er solle aufhören, was er tut. Wenn der Worker-Thread "Interrupt-fähig" ist, wird er feststellen, dass er durch eine Ausnahme oder durch regelmäßige Überprüfung seines unterbrochenen Flags unterbrochen wurde. Wenn ein gut erzogener Thread bemerkt, dass er unterbrochen wurde, gibt er auf, was er tut, und beendet sich selbst.
Unter der Annahme des obigen Anwendungsfalls wird Ihr Code wahrscheinlich unterbrochen, wenn er in einem Java-Framework oder in einem Arbeitsthread ausgeführt wird. Und wenn es unterbrochen wird, sollte Ihr Code aufgeben, was er tut, und sich mit den am besten geeigneten Mitteln selbst beenden. Abhängig davon, wie Ihr Code aufgerufen wurde, kann dies durch Zurückgeben oder durch Auslösen einer geeigneten Ausnahme erfolgen. Aber es sollte wohl nicht anrufen System.exit()
. (Ihre Anwendung weiß nicht unbedingt, warum sie unterbrochen wurde, und sie weiß sicherlich nicht, ob andere Threads vom Framework unterbrochen werden müssen.)
Wenn Ihr Code jedoch nicht für die Ausführung unter einem bestimmten Framework ausgelegt ist, können Sie argumentieren, dass dies InterruptedException
eine unerwartete Ausnahme ist. dh ein Fehler. In diesem Fall sollten Sie die Ausnahme wie andere Fehler behandeln. Binden Sie es beispielsweise in eine nicht aktivierte Ausnahme ein und fangen Sie es an derselben Stelle ab und protokollieren Sie es, an der Sie sich mit anderen unerwarteten nicht aktivierten Ausnahmen befassen. (Alternativ kann Ihre Anwendung den Interrupt einfach ignorieren und das tun, was sie getan hat.)
1) Was kann eine InterruptedException auslösen, wenn ich niemals andere Threads selbst unterbreche?
Ein Beispiel ist, wenn Ihre Runnable
Objekte mit einem ausgeführt werden ExecutorService
und shutdownNow()
im Dienst aufgerufen werden. Und theoretisch könnte jeder Thread-Pool oder jedes Thread-Management-Framework eines Drittanbieters legitimerweise so etwas tun.
2) Wenn ich niemals selbst andere Threads mit Interrupt () unterbreche ... was bedeutet ein InterruptedException
dann? Was soll ich tun, wenn ich einen fange? App herunterfahren?
Sie müssen die Codebasis analysieren, um herauszufinden, was die interrupt()
Anrufe tätigt und warum. Sobald Sie das herausgefunden haben, können Sie herausfinden, was >> Ihr << Teil der App tun muss.
Bis Sie wissen, warum InterruptedException
geworfen wird, würde ich empfehlen, es als einen schweren Fehler zu behandeln; Drucken Sie beispielsweise einen Stacktrace in die Protokolldatei und fahren Sie die App herunter. (Natürlich ist das nicht immer die richtige Antwort ... aber der Punkt ist, dass dies "ein Fehler" ist und der Entwickler / Betreuer darauf aufmerksam gemacht werden muss.)
3) Wie finde ich heraus, wer / was anruft interrupt()
?
Darauf gibt es keine gute Antwort. Das Beste, was ich vorschlagen kann, ist, einen Haltepunkt auf dem festzulegen Thread.interrupt()
und den Aufrufstapel zu betrachten.