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?

  1. isInterrupted() → Devuelve true si el hilo ha sido interrumpido. No borra el estado de interrupción. (siguientes llamadas siguen devolviendo true)
  2. Thread.interrupted() → Devuelve true si el hilo actual ha sido interrumpido y borra el estado de interrupción. (siguientes llamadas devuelve false)