VademécumVademécum\Interrupciones (concepto)

Interrupciones (concepto)

Un thread puede interrumpir a otro:

otra.interrupt();

 

El thread interrumpido lo ve como una excepción si está esperando algo (WAITING), o tiene que mirarlo explícitamente si está corriendo (RUNNABLE).

Para lo que sigue, supondremos que la llamada interrupt() activa un flag en la tarea interrumpida:

private boolan flagI = false;

flagI = true;

 

La tarea interrumpida puede hacer 3 cosas:

1.       Capturar una InterruptedException

2.       Chequear con interrupted()

3.       Chequear con isInterrupted()

Cada una de las tres opciones es sutilmente diferente.

La primera opción es recibir una InterruptedException. Esto ocurre cuando la tarea está realizando alguna operación que la tiene en estado WAITING. Por ejemplo

try {

Thread.sleep(s * 1000);

} catch (InterruptedException e) {

// habrá que hacer algo

}

 

Java captura la excepción y, además, resetea el flag

flagI = false;

 

Si el thread no está esperando, entonces sigue funcionando normalmente, pero podemos comprobar de vez en cuando si hay una interrupción pendiente.

Tenemos dos formas de saber si el thread tiene una solicitud de interrupción pendiente de atender:

static boolean interrupted()

Es una llamada a la clase Thread. Devuelve TRUE si el thread que se está ejecutando tiene una interrupción pendiente.

Y según responde, elimina la interrupción.

flagI = false;

 

boolean isInterrupted()

Es una llamada a un objeto Thread. Devuelve TRUE si el objeto tiene una interrupción pendiente.

A diferencia del otro método, la interrupción permanece pendiente: No se modifica flagI. Como consecuencia, en algún momento habrá que llamar a interrupted() para resetearlo.

 

si …

flagI

interrupt()

flagI = true;

catch (InterruptedException e)

flagI = false;

if (interrupted())

flagI = false;

if (isInterrupted ())

// sigue igual

 

principio