Die richtige Standardauswahl ist das Hinzufügen von InterruptedException zu Ihrer Wurfliste. Ein Interrupt zeigt an, dass ein anderer Thread wünscht, dass Ihr Thread endet. Der Grund für diese Anfrage wird nicht offensichtlich und ist vollständig kontextbezogen. Wenn Sie also keine zusätzlichen Kenntnisse haben, sollten Sie davon ausgehen, dass es sich nur um ein freundliches Herunterfahren handelt, und alles, was dieses Herunterfahren vermeidet, ist eine nicht freundliche Antwort.
Java wird InterruptedException's nicht zufällig auslösen. Alle Ratschläge wirken sich nicht auf Ihre Anwendung aus, aber ich bin auf einen Fall gestoßen, in dem Entwickler, die der "Swallow" -Strategie folgen, sehr unpraktisch wurden. Ein Team hatte eine große Anzahl von Tests entwickelt und Thread.Sleep viel verwendet. Jetzt haben wir begonnen, die Tests auf unserem CI-Server auszuführen, und manchmal steckten aufgrund von Fehlern im Code permanente Wartezeiten fest. Um die Situation zu verschlimmern, wurde beim Versuch, den CI-Job abzubrechen, nie geschlossen, da der Thread.Interrupt, der den Test abbrechen sollte, den Job nicht abbrach. Wir mussten uns in die Box einloggen und die Prozesse manuell beenden.
Kurz gesagt, wenn Sie einfach die InterruptedException auslösen, stimmen Sie mit der Standardabsicht überein, dass Ihr Thread enden soll. Wenn Sie InterruptedException nicht zu Ihrer Wurfliste hinzufügen können, würde ich sie in eine RuntimeException einschließen.
Es gibt ein sehr rationales Argument dafür, dass InterruptedException selbst eine RuntimeException sein sollte, da dies eine bessere "Standard" -Behandlung fördern würde. Es ist keine RuntimeException, nur weil die Designer an einer kategorischen Regel festhielten, dass eine RuntimeException einen Fehler in Ihrem Code darstellen sollte. Da eine InterruptedException nicht direkt aus einem Fehler in Ihrem Code entsteht, ist dies nicht der Fall. Die Realität ist jedoch, dass häufig eine InterruptedException auftritt, weil ein Fehler in Ihrem Code vorliegt (z. B. Endlosschleife, Deadlock), und der Interrupt eine Methode eines anderen Threads zur Behandlung dieses Fehlers ist.
Wenn Sie wissen, dass eine rationale Bereinigung durchgeführt werden muss, dann tun Sie es. Wenn Sie eine tiefere Ursache für den Interrupt kennen, können Sie eine umfassendere Behandlung übernehmen.
Zusammenfassend sollte Ihre Auswahl für die Handhabung dieser Liste folgen:
- Standardmäßig zu Würfen hinzufügen.
- Wenn Sie keine Würfe hinzufügen dürfen, werfen Sie RuntimeException (e). (Beste Auswahl mehrerer schlechter Optionen)
- Nur wenn Sie eine explizite Ursache für den Interrupt kennen, gehen Sie wie gewünscht vor. Wenn Ihre Behandlung lokal für Ihre Methode ist, setzen Sie das Zurücksetzen unterbrochen durch einen Aufruf von Thread.currentThread (). Interrupt ().