Interrupt A Thread
Interrupt a thread
“INTERUPTED” no es un estado en el ciclo de vida de un hilo en Java. En su lugar, la interrupción es un mecanismo que se usa para señalar a un hilo que debería detenerse o reaccionar de alguna manera, pero el estado del hilo seguirá siendo uno de los seis estados principales (NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED).
Cuando se interrumpe un hilo, su estado no cambia automáticamente. Sin embargo, si el hilo está en WAITING o TIMED_WAITING, lanzar una interrupción (interrupt()) provoca una excepción InterruptedException, lo que permite que el hilo reaccione y posiblemente termine.
Ejemplo de interrupción en diferentes estados
1️⃣ Interrumpir un hilo en RUNNABLE (No tiene efecto inmediato)
Thread t = new Thread(() -> {
while (true) {
if (Thread.currentThread().isInterrupted()) {
System.out.println("Hilo interrumpido, saliendo...");
break;
}
}
});
t.start();
Thread.sleep(1000);
t.interrupt(); // Marca el hilo como interrumpido, pero sigue en RUNNABLE hasta que lo revise.
🔹 Explicación: interrupt() solo marca el hilo como interrumpido. No se detiene a menos que lo revise con isInterrupted().
2️⃣ Interrumpir un hilo en WAITING o TIMED_WAITING (Lanza excepción)
Thread t = new Thread(() -> {
try {
Thread.sleep(5000); // Pasa a TIMED_WAITING
} catch (InterruptedException e) {
System.out.println("Hilo interrumpido mientras dormía");
}
});
t.start();
Thread.sleep(1000);
t.interrupt(); // Provoca InterruptedException y saca al hilo de TIMED_WAITING.
🔹 Explicación: Como el hilo estaba en TIMED_WAITING (por sleep(5000)), la interrupción lanza una InterruptedException y el hilo puede manejarla.
¿Cómo se verifica si un hilo ha sido interrumpido?
isInterrupted()→ Devuelvetruesi el hilo ha sido interrumpido. No borra el estado de interrupción. (siguientes llamadas siguen devolviendo true)Thread.interrupted()→ Devuelvetruesi el hilo actual ha sido interrumpido y borra el estado de interrupción. (siguientes llamadas devuelve false)