Die richtige Standardauswahl besteht darin, InterruptedException Ihrer Wurfliste hinzuzufügen. Ein Interrupt zeigt an, dass ein anderer Thread wünscht, dass Ihr Thread endet. Der Grund für dieses Anliegen wird nicht offensichtlich gemacht und ist vollständig kontextabhängig, daher sollten Sie, wenn Sie keine zusätzlichen Informationen haben, davon ausgehen, dass es sich nur um einen freundlichen Abschluss handelt, und alles, was diesen Abschluss verhindert, ist eine unfreundliche Reaktion.
Java wirft nicht zufällig InterruptedException's, alle Ratschläge werden Ihre Anwendung nicht beeinflussen, aber ich bin auf einen Fall gestoßen, in dem Entwickler, die der "schlucken"-Strategie folgten, sehr unbequem wurden. Ein Team hatte eine große Anzahl von Tests entwickelt und Thread.Sleep häufig verwendet. Jetzt begannen wir, die Tests auf unserem CI-Server auszuführen, und manchmal blieben sie aufgrund von Mängeln im Code in permanenten Wartezeiten stecken. Um die Situation noch schlimmer zu machen, schloss der Versuch, den CI-Job abzubrechen, nie richtig, weil der Thread.Interrupt, der vorgesehen war, um den Test abzubrechen, den Job nicht abbrach. Wir mussten uns anmelden und die Prozesse manuell beenden.
Kurz gesagt, wenn Sie einfach die InterruptedException werfen, entsprechen Sie der Standardabsicht, dass Ihr Thread enden sollte. Wenn Sie InterruptedException nicht zu Ihrer Wurfliste hinzufügen können, würde ich sie in eine RuntimeException einwickeln.
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. Aber die Realität ist, dass eine InterruptedException oft auftritt, weil es einen Fehler in Ihrem Code gibt (z.B. eine Endlosschleife, ein Deadlock), und der Interrupt ist die Methode eines anderen Threads, um mit diesem Fehler umzugehen.
Wenn Sie wissen, dass es rationale Aufräumarbeiten gibt, dann führen Sie sie durch. Wenn Sie eine tiefere Ursache für den Interrupt kennen, können Sie eine umfassendere Behandlung übernehmen.
Also sollten Ihre Optionen zur Behandlung dieser Liste folgen:
- Standardmäßig zu Würfen hinzufügen.
- Wenn das Hinzufügen zu den Würfen nicht erlaubt ist, werfen Sie RuntimeException(e). (Beste Wahl unter mehreren schlechten Optionen)
- Nur wenn Sie eine explizite Ursache des Interrupts kennen, behandeln Sie ihn wie gewünscht. Wenn Ihre Bearbeitung lokal für Ihre Methode ist, setzen Sie den Interrupt durch Aufruf von Thread.currentThread().interrupt() zurück.
3 Stimmen
javaspecialists.eu/archiv/Ausgabe056.html