método de interrupção
Interromper significa literalmente interromper, mas em Java o método Thread.interrupt() na verdade notifica o thread de alguma forma e não o encerra diretamente. Cabe à pessoa que escreveu o código decidir o que fazer e geralmente abortamos o thread.
Se o thread estiver chamando o método wait(), wait(long) ou wait(long, int) da classe Object, ou o método join(), join(long), join(long, int), sleep(long) ou sleep da classe (long, int) for bloqueado durante o método, seu status de interrupção será limpo e também receberá uma InterruptedException.
Se o thread for bloqueado em uma operação de E/S em um canal interrompível (java.nio.channels.InterruptibleChannel), o canal será fechado, o status de interrupção do thread será definido e o thread receberá uma ClosedByInterruptException.
Se o thread estiver bloqueado em um Seletor (java.nio.channels.Selector), o status de interrupção do thread será definido e ele retornará imediatamente da operação select, possivelmente com um valor diferente de zero, como se select fosse chamado de wakeup o método do dispositivo é o mesmo.
Se nenhuma das condições anteriores tiver sido salva, o status de interrupção do thread será definido.
Interromper um thread inativo não tem efeito.
detectar interrupção
Como a interrupção é detectada depende do que o thread está fazendo.
Se o thread chamar um método que pode lançar InterruptException, capture o InterruptException e, em seguida, trate-o no bloco catch (geralmente saindo do método run para interromper o thread)
Se você chamar outros métodos, poderá verificar Thread.interrupted quando ocioso para determinar se um sinal de interrupção foi recebido e processá-lo após confirmar que o sinal de interrupção foi recebido. Uma InterruptException pode ser lançada para ser consistente com o método de tratamento anterior
estado de interrupção
O mecanismo de interrupção do thread é implementado usando o sinalizador interno do status de interrupção. O status de interrupção é definido quando o método interrupt() do thread é chamado (veja a descrição do método de interrupção acima).
Existem duas maneiras de obter o status de interrupção de um thread:
Chame o método estático Thread.interrupted(). Além de retornar o status de interrupção do thread atual, este método também limpa o status de interrupção do thread atual. Em outras palavras, se este método for chamado duas vezes seguidas, a segunda chamada retornará falso (após a primeira chamada limpar seu status de interrupção e antes que a segunda chamada verifique o status de interrupção, o thread atual será interrompido novamente. exceções ).
Chame o método isInterrupted() do thread especificado. Este método retorna apenas o status de interrupção do thread especificado sem afetar o status de interrupção do thread.
Existem duas maneiras de limpar o status de interrupção de um thread:
Como mencionado acima, chamando Thread.interrupted()
Quando o método interrupt() do thread é chamado para causar InterruptedException, o status de interrupção do thread foi limpo ao mesmo tempo, incluindo o método wait(), wait(long) ou wait(long, int) do objeto classe, ou o método join() , join(long) , join(long, int) , sleep(long) ou sleep(long, int)