O mecanismo de interrupção de thread é a maneira preferida de fazer com que um thread (em cooperação) responda a uma solicitação para interromper o que está fazendo. Qualquer tópico (incluindo o próprio tópico, eu acho) poderia chamar interrupt()
um Tópico.
Na prática, os casos de uso normais para interrupt()
envolvem algum tipo de estrutura ou gerente dizendo a algum thread de trabalho para parar o que está fazendo. Se o thread de trabalho estiver "ciente de interrupção", ele notará que foi interrompido por meio de uma exceção ou verificando periodicamente seu sinalizador de interrupção. Ao perceber que foi interrompido, um fio bem comportado abandonaria o que está fazendo e se encerraria.
Supondo o caso de uso acima, seu código provavelmente será interrompido se for executado dentro de uma estrutura Java ou de algum thread de trabalho. E quando for interrompido, seu código deve abandonar o que está fazendo e fazer com que seja encerrado da maneira mais apropriada. Dependendo de como seu código foi chamado, isso pode ser feito retornando ou lançando alguma exceção apropriada. Mas provavelmente não deveria chamar System.exit()
. (Seu aplicativo não sabe necessariamente por que foi interrompido e certamente não sabe se há outros threads que precisam ser interrompidos pela estrutura.)
Por outro lado, se seu código não foi projetado para ser executado sob o controle de alguma estrutura, você pode argumentar que InterruptedException
é uma exceção inesperada; ou seja, um bug. Nesse caso, você deve tratar a exceção como faria com outros bugs; por exemplo, envolva-o em uma exceção não verificada e capture e registre-o no mesmo ponto em que você lida com outras exceções não verificadas inesperadas. (Alternativamente, seu aplicativo pode simplesmente ignorar a interrupção e continuar fazendo o que estava fazendo.)
1) Se eu nunca estou interrompendo outros threads, o que pode disparar uma InterruptedException?
Um exemplo é se seus Runnable
objetos são executados usando um ExecutorService
e shutdownNow()
são chamados no serviço. E, em teoria, qualquer pool de threads de terceiros ou estrutura de gerenciamento de threads poderia legitimamente fazer algo assim.
2) Se eu nunca interrompo outras threads usando interrupt () ... o que significa um InterruptedException
then? O que devo fazer ao pegar um? Desligar meu aplicativo?
Você precisa analisar a base de código para descobrir o que está fazendo as interrupt()
chamadas e por quê. Depois de descobrir isso, você pode descobrir o que >> sua << parte do aplicativo precisa fazer.
Até que você saiba por que InterruptedException
está sendo lançado, aconselho tratá-lo como um erro grave; por exemplo, imprima um rastreamento de pilha para o arquivo de log e desligue o aplicativo. (Obviamente, nem sempre essa é a resposta certa ... mas a questão é que isso é "um bug" e precisa ser levado ao conhecimento do desenvolvedor / mantenedor.)
3) Como descubro quem / o que está ligando interrupt()
?
Não há uma boa resposta para isso. O melhor que posso sugerir é definir um ponto de interrupção no Thread.interrupt()
e olhar para a pilha de chamadas.