La diferencia entre los métodos relacionados con la interrupción de subprocesos: interrupción, interrupción e interrupción

interrumpir

Interrumpe este hilo. El estado del hilo que llama a este método se establecerá en el estado "interrumpido" y el hilo no dejará de ejecutarse.
Si el hilo está bloqueado al llamar al método wait (), wait (long) o wait (long, int) o join (), join (long), join (long, int) de la clase Object, sleep (long) o Para métodos como sleep (long, int), el estado interrumpido se borrará y se recibirá InterruptedException. ( Antes de que el bloqueo JUC o la clase relacionada con la cola arrojen InterruptedException, se llamará al siguiente método estático interrumpido para borrar el estado interrumpido. Por eso es necesario lanzar esta excepción nuevamente o llamar a la interrupción nuevamente; de ​​lo contrario, la interrupción del hilo estado perdido. Por ejemplo: el subproceso principal monitorea el estado de interrupción del subproceso secundario para realizar diferentes tratamientos. Si el subproceso secundario arroja esta excepción y no la maneja correctamente, el subproceso principal no percibirá el estado de interrupción del subproceso secundario . )
Si este hilo está en la operación de E / S de InterruptibleChannel Si está bloqueado, el canal se cerrará, se establecerá el estado de interrupción del hilo y el hilo recibirá java.nio.channels.ClosedByInterruptException.
Si este hilo está bloqueado en java.nio.channels.Selector, se establecerá el estado de interrupción de este hilo y volverá inmediatamente de la operación de selección (puede tener un valor distinto de cero), al igual que llamar al método de activación de el selector.
Si no se cumple ninguna de las condiciones anteriores, se establecerá el estado de interrupción del hilo.
Interrumpir un hilo que no se está ejecutando no tiene ningún efecto 

interrumpido

Método estático. Pruebe si el hilo actual se ha interrumpido. A través de este método, se puede borrar el estado de interrupción del hilo. En otras palabras, si desea llamar a este método dos veces seguidas, la segunda llamada devolverá falso (a menos que el hilo actual se interrumpa nuevamente después de que la primera llamada borre su estado interrumpido y antes de que la segunda llamada verifique su estado).
Dado que este método devuelve falso, reflejará la interrupción del hilo y será ignorado porque el hilo no estaba activo cuando fue interrumpido

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

isInterrupted

Pruebe si este hilo se ha interrumpido. El estado de interrupción del hilo no se ve afectado por este método.
Dado que este método devuelve falso, reflejará la interrupción del hilo y será ignorado porque el hilo no estaba activo cuando fue interrumpido

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

isInterrupted (boolean)

    private native boolean isInterrupted(boolean ClearInterrupted);

 Se puede ver que tanto interrumpido como isInterrupted llaman al método local interno isInterrupted, y el parámetro es si el estado de la interrupción es claro.

La diferencia entre interrumpido e isInterrupted : interrumpido actúa sobre el hilo actual, e isInterrupted actúa sobre el objeto hilo que llama a este método. Por ejemplo: llame al método isInterrupted del subproceso secundario en el subproceso principal principal, y llame al método interrumpido estático al mismo tiempo. Entonces isInterrupted actúa en el subproceso secundario y actúa interrumpido en el subproceso principal.

Supongo que te gusta

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