Por que invocar o método Thread.currentThread.interrupt()
no bloco catch?
fonte
Por que invocar o método Thread.currentThread.interrupt()
no bloco catch?
Isso é feito para manter o estado .
Ao capturar InterruptException
e engolir, você basicamente impede que métodos / grupos de segmentos de nível superior notem a interrupção. O que pode causar problemas.
Ao ligar Thread.currentThread().interrupt()
, você define o sinalizador de interrupção do encadeamento, para que os manipuladores de interrupção de nível mais alto notem e possam lidar com isso adequadamente.
A Concorrência Java na Prática discute isso com mais detalhes no Capítulo 7.1.3: Respondendo à interrupção . Sua regra é:
Somente o código que implementa a diretiva de interrupção de um encadeamento pode engolir uma solicitação de interrupção. O código de tarefa e biblioteca de uso geral nunca deve engolir solicitações de interrupção.
InterruptedException
status de interrupção limpa quando o faz. Acho que isso torna a resposta mais clara em termos de por que você precisa preservar o status de interrupção.interrupt()
chamada é a única maneira de definir o sinalizador interrompido depois que você recebe uma notificação sobre esse estado por meio do outro "mecanismo de entrega" - oInterruptedException
e deseja ou não pode jogá-lo novamente.Eu acho que esse exemplo de código deixa as coisas um pouco claras. A classe que faz o trabalho:
A classe principal:
Tente interromper a chamada sem restaurar o status.
fonte
Nota:
http://download.oracle.com/javase/7/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html
Como interrompo um encadeamento que aguarda longos períodos (por exemplo, entrada)?
Isso garante que o Thread reraise a InterruptedException assim que possível.
fonte
Eu consideraria uma prática ruim ou pelo menos um pouco arriscada. Geralmente, os métodos de nível superior não realizam operações de bloqueio e nunca serão vistos
InterruptedException
lá. Se você o mascarar em todos os lugares em que executar operações interruptíveis, nunca o conseguirá.A única lógica para
Thread.currentThread.interrupt()
e não gerar nenhuma outra exceção ou solicitação de interrupção de sinalização de qualquer outra maneira (por exemplo, definirinterrupted
variável variável local no loop principal de um encadeamento) é a situação em que você realmente não pode fazer nada com a exceção, como nosfinally
blocos.Veja a resposta de Péter Török, se você quiser entender melhor as implicações da
Thread.currentThread.interrupt()
chamada.fonte
Consulte java doc
Portanto, se você alterar o método sleepBabySleep () no @Ajay George Answer à operação de E / S ou apenas um sysout, não será necessário definir o status novamente para interromper o programa. (BTW, eles nem lançam InterruptedException)
Assim como @ Péter Török disse => Isso é feito para manter o estado. (Especialmente para o método que lançará InterruptedException)
fonte