¿Por qué Thread.isInterrupted () siempre devuelve false?

Encontré el método de JavaDoc:

Devuelve: verdadero si este hilo ha sido interrumpido; falso de lo contrario.

Creo que algo está mal con mi comprensión del método. Además, puedo malinterpretar el concepto ‘interrupt’ en Thread.

¡Cualquier explicación es bienvenida! ¡Gracias!

Fragmento de código:

En la definición de hilo:

public void run() { try { //Do something } catch (InterruptedException e) { System.out.println(isInterrupted());//Always false return; } } 

invocar:

 theThread.interrupt(); 

Una vez que se lanza la excepción, el hilo ya no está en un estado interrumpido.

Este comportamiento generalmente se documenta en métodos que generan esa excepción. Por ejemplo, el javadoc para Object.wait() dice:

InterruptedException : si un hilo ha interrumpido el hilo actual antes o mientras el hilo actual estaba esperando una notificación. El estado interrumpido del hilo actual se borra cuando se lanza esta excepción.

De hecho, el javadoc para la excepción misma dice esto:

“Ocasionalmente, un método puede desear probar si el hilo actual se ha interrumpido, y si es así, lanzar inmediatamente esta excepción. El siguiente código se puede usar para lograr este efecto:

 if (Thread.interrupted()) // Clears interrupted status! throw new InterruptedException(); 

Observe cómo enfatizan que la bandera se debe borrar antes de lanzar la excepción.


¿Por qué fue diseñado para funcionar así? Tendría que preguntárselo a los diseñadores, pero supongo que pensaron que un manejador de excepciones debería manejar la situación y que, por lo tanto, no debería haber necesidad de que la bandera aún se establezca en ese punto. (Si el manejador no maneja completamente la situación, puede volver a lanzar la excepción o llamar a Thread.getCurrentThread.interrupt() para establecer el indicador de nuevo).

Agregando a la respuesta de cdhowie, un patrón estándar es dejar que el hilo controle la interrupción. Esto es útil con los ejecutores , cuando el código de ejecución no “posee” el subproceso y no debe interferir con la interrupción (a menos que realmente sepa lo que está haciendo)

 public void run() { try { //Do something } catch (InterruptedException e) { // Do whatever local clean up you need to ... // Then let the owning Thread know it's been interrupted, so it too can clean up Thread.currentThread().interrupt(); // } } 

Verificaría que está Interrumpido () en tu propio código, por ejemplo, desde un bucle. Si el hilo se ha interrumpido, puede lanzar InterruptedException para detener la ejecución.

En su ejemplo, si capturó InterruptedException puede estar seguro de que fue interrumpido y no tiene que verificar ese método.