A diferença entre os métodos de interrupção de thread relacionados interrupt, interrupted e isInterrupted

interromper

Interrompa esta discussão. O estado do encadeamento que chama esse método será definido como "interrompido" e o encadeamento não para de funcionar.
Se a thread estiver bloqueada ao chamar o método wait (), wait (long) ou wait (long, int) ou join (), join (long), método join (long, int) da classe Object, sleep (long) ou Para métodos como sleep (long, int), o status interrompido será limpo e InterruptedException será recebido. ( Antes do bloqueio JUC ou da classe relacionada à fila lançar InterruptedException, o seguinte método estático interrompido será chamado para limpar o estado interrompido. É por isso que é necessário lançar essa exceção novamente ou chamar a interrupção novamente, caso contrário, a interrupção do thread ser perdido Status. Por exemplo: o thread principal monitora o status de interrupção do thread filho para fazer diferentes tratamentos. Se o thread filho lançar esta exceção e não tratá-la corretamente, o thread principal não perceberá o status de interrupção do thread filho . )
Se este encadeamento estiver na operação de E / S de InterruptibleChannel Se bloqueado, o canal será fechado, o status de interrupção do encadeamento será definido e o encadeamento receberá java.nio.channels.ClosedByInterruptException.
Se este encadeamento estiver bloqueado em java.nio.channels.Selector, o status de interrupção deste encadeamento será definido e retornará imediatamente da operação de seleção (pode ter um valor diferente de zero), assim como chamar o método de despertar de o seletor.
Se nenhuma das condições acima for verdadeira, o status de interrupção do encadeamento será definido.
Interromper um thread que não está em execução não tem efeito 

interrompido

Método estático. Teste se o thread atual foi interrompido. Por meio desse método, o status de interrupção do encadeamento pode ser apagado. Em outras palavras, se você quiser chamar esse método duas vezes seguidas, a segunda chamada retornará falso (a menos que o thread atual seja interrompido novamente após a primeira chamada limpar seu status interrompido e antes que a segunda chamada verifique seu status).
Uma vez que este método retorna falso, ele refletirá a interrupção do encadeamento e será ignorado porque o encadeamento não estava ativo quando foi interrompido

  public static boolean interrupted() {
        return currentThread().isInterrupted(true);
    }

é interrompido

Teste se este tópico foi interrompido. O status de interrupção do encadeamento não é afetado por este método.
Uma vez que este método retorna falso, ele refletirá a interrupção do encadeamento e será ignorado porque o encadeamento não estava ativo quando foi interrompido

   public boolean isInterrupted() {
        return isInterrupted(false);
    }

isInterrupted (boolean)

    private native boolean isInterrupted(boolean ClearInterrupted);

 Pode ser visto que tanto interrompido quanto isInterrupted chamam o método local interno isInterrupted, e o parâmetro é se o status de interrupção está limpo.

A diferença entre interrompido e isInterrupted : interrompido atua no segmento atual e isInterrupted atua no objeto de segmento que chama este método. Por exemplo: chame o método isInterrupted do sub thread filho no thread principal principal e chame o método interrompido estático ao mesmo tempo. Em seguida, isInterrupted atua no sub thread filho e atua interrompido no thread principal principal

Acho que você gosta

Origin blog.csdn.net/sinat_33472737/article/details/114681170
Recomendado
Clasificación