Le choix par défaut correct est d'ajouter InterruptedException à votre liste de lancers. Une interruption indique qu'un autre thread souhaite que votre thread se termine. La raison de cette demande n'est pas rendue évidente et est entièrement contextuelle, donc si vous n'avez pas de connaissances supplémentaires, vous devez supposer que c'est juste un arrêt amical, et tout ce qui évite cet arrêt est une réponse non amicale.
Java ne lèvera pas au hasard InterruptedException, tous les conseils n'affecteront pas votre application, mais j'ai rencontré un cas où le développeur suivant la stratégie "swallow" est devenu très gênant. Une équipe avait développé un large éventail de tests et utilisé beaucoup Thread.Sleep. Maintenant, nous avons commencé à exécuter les tests sur notre serveur CI, et parfois, en raison de défauts dans le code, nous nous retrouvions coincés dans des attentes permanentes. Pour aggraver la situation, lorsque vous tentiez d'annuler le travail CI, il ne se fermait jamais car le thread. L'interruption qui était destinée à abandonner le test n'a pas interrompu le travail. Nous avons dû nous connecter à la boîte et tuer manuellement les processus.
Donc, pour faire court, si vous lancez simplement l'exception InterruptedException, vous correspondez à l'intention par défaut de la fin de votre thread. Si vous ne pouvez pas ajouter InterruptedException à votre liste de lancers, je l'envelopperais dans une RuntimeException.
Il y a un argument très rationnel à faire valoir que InterruptedException devrait être une RuntimeException elle-même, car cela encouragerait une meilleure gestion "par défaut". Ce n'est pas une RuntimeException uniquement parce que les concepteurs se sont tenus à une règle catégorique selon laquelle une RuntimeException devrait représenter une erreur dans votre code. Puisqu'une InterruptedException ne résulte pas directement d'une erreur dans votre code, ce n'est pas le cas. Mais la réalité est que souvent une InterruptedException se produit parce qu'il y a une erreur dans votre code, (c'est-à-dire une boucle sans fin, un verrou mortel), et l'Interruption est une autre méthode d'un autre thread pour traiter cette erreur.
Si vous savez qu'il y a un nettoyage rationnel à faire, faites-le. Si vous connaissez une cause plus profonde de l'interruption, vous pouvez prendre en charge une gestion plus complète.
Donc, en résumé, vos choix de manipulation doivent suivre cette liste:
- Par défaut, ajoutez aux lancers.
- S'il n'est pas autorisé à ajouter aux lancers, lancez RuntimeException (e). (Meilleur choix de plusieurs mauvaises options)
- Seulement lorsque vous connaissez une cause explicite de l'interruption, gérez-la comme vous le souhaitez. Si votre gestion est locale à votre méthode, réinitialisez-la interrompue par un appel à Thread.currentThread (). Interrupt ().