A opção padrão correta é adicionar InterruptedException à sua lista de lançamentos. Uma interrupção indica que outro segmento deseja que seu segmento termine. A razão para esta solicitação não é evidenciada e é totalmente contextual; portanto, se você não tiver nenhum conhecimento adicional, deve presumir que é apenas um desligamento amigável e qualquer coisa que evite esse desligamento é uma resposta não amigável.
O Java não lançará aleatoriamente o InterruptedException, todos os conselhos não afetarão seu aplicativo, mas encontrei um caso em que o desenvolvedor que seguiu a estratégia de "engolir" se tornou muito inconveniente. Uma equipe desenvolveu um grande conjunto de testes e usou muito o Thread.Sleep. Agora começamos a executar os testes em nosso servidor de IC e, às vezes, devido a defeitos no código, ficavam presos em esperas permanentes. Para piorar a situação, ao tentar cancelar o trabalho de IC, ele nunca foi fechado porque o Thread.Interrupt destinado a interromper o teste não interrompeu o trabalho. Tivemos que entrar na caixa e matar manualmente os processos.
Para encurtar a história, se você simplesmente lançar a InterruptedException, estará correspondendo à intenção padrão de que seu encadeamento termine. Se você não pode adicionar InterruptedException à sua lista de lançamentos, eu a agruparia em uma RuntimeException.
Há um argumento muito racional a ser feito de que InterruptedException deve ser uma RuntimeException em si, pois isso incentivaria uma melhor manipulação "padrão". Não é uma RuntimeException apenas porque os designers aderiram a uma regra categórica de que uma RuntimeException deve representar um erro no seu código. Como uma InterruptedException não surge diretamente de um erro no seu código, não é. Mas a realidade é que muitas vezes surge uma InterruptedException porque há um erro no seu código (ou seja, loop infinito, dead-lock), e a Interrupção é outro método de outro encadeamento para lidar com esse erro.
Se você sabe que há uma limpeza racional a ser feita, faça-o. Se você conhece uma causa mais profunda da interrupção, pode assumir um tratamento mais abrangente.
Portanto, em resumo, suas opções de manuseio devem seguir esta lista:
- Por padrão, adicione às jogadas.
- Se não for permitido adicionar jogadas, jogue RuntimeException (e). (Melhor escolha de várias opções ruins)
- Somente quando você souber uma causa explícita da interrupção, manipule conforme desejado. Se o seu tratamento for local para o seu método, redefina a interrupção por uma chamada para Thread.currentThread (). Interrupt ().