Ciclo De Vida De Un Hilo

Ciclo de Vida de un Hilo

Introducción

Un hilo en Java pasa por varios estados durante su existencia, conocidos como el ciclo de vida del hilo. Comprender estos estados es esencial para gestionar correctamente la concurrencia y prevenir problemas como bloqueos o comportamientos inesperados.

Un hilo puede estar en uno de los siguientes estados: NEW, RUNNABLE, RUNNING, BLOCKED/WAITING o TERMINATED.


Estado Descripción Métodos Relacionados
NEW El hilo ha sido creado pero no iniciado. new Thread()
RUNNABLE El hilo está listo para ejecutarse, esperando ser asignado al procesador. start()
RUNNING El hilo está en ejecución activa en el procesador. N/A
BLOCKED/WAITING El hilo está esperando un recurso o señal (ejemplo: sincronización o tiempo). wait(), sleep(), join(), synchronized.
TERMINATED El hilo ha completado su tarea y no volverá a ejecutarse. N/A

Estados en Detalle

1. NEW

Un hilo se encuentra en este estado cuando se crea, pero no ha comenzado su ejecución. En este estado, el hilo aún no consume recursos del procesador.

Ejemplo

Thread hilo = new Thread(() -> System.out.println("Hilo en ejecución"));
System.out.println("Estado del hilo: " + hilo.getState()); // Estado: NEW

2. RUNNABLE

Cuando se llama al método start(), el hilo pasa al estado RUNNABLE, donde está listo para ejecutarse pero debe esperar a que el procesador lo asigne.

Nota: En Java, no se diferencia explícitamente entre RUNNABLE y RUNNING como en otros sistemas.

Ejemplo

Thread hilo = new Thread(() -> System.out.println("Hilo en ejecución"));
hilo.start();
System.out.println("Estado del hilo: " + hilo.getState()); // Estado: RUNNABLE

3. RUNNING

Cuando el planificador del sistema operativo asigna recursos al hilo, este comienza a ejecutarse activamente. Este estado no tiene una representación directa en Java, ya que se considera parte de RUNNABLE.


4. BLOCKED/WAITING

El hilo entra en este estado si:

  1. Está esperando por un recurso bloqueado (como un objeto sincronizado).
  2. Está esperando una señal o un evento externo.

Ejemplo de wait()

class EjemploBloqueo {
    public synchronized void metodoBloqueado() {
        try {
            wait(); // El hilo entra en WAITING
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

public class EjemploEstadoBloqueado {
    public static void main(String[] args) throws InterruptedException {
        EjemploBloqueo bloqueo = new EjemploBloqueo();

        Thread hilo = new Thread(bloqueo::metodoBloqueado);
        hilo.start();

        Thread.sleep(100); // Dar tiempo para que el hilo entre en WAITING
        System.out.println("Estado del hilo: " + hilo.getState()); // Estado: WAITING
    }
}

5. TERMINATED

Cuando el hilo termina de ejecutar su método run() o lanza una excepción no controlada, pasa al estado TERMINATED.

Ejemplo

public class EjemploTerminado {
    public static void main(String[] args) throws InterruptedException {
        Thread hilo = new Thread(() -> System.out.println("Hilo completado"));
        hilo.start();
        hilo.join(); // Esperar a que el hilo termine
        System.out.println("Estado del hilo: " + hilo.getState()); // Estado: TERMINATED
    }
}

Ciclo de Vida Completo: Ejemplo Visual

public class CicloCompletoHilo extends Thread {
    @Override
    public void run() {
        System.out.println("Ejecutando el hilo...");
        try {
            Thread.sleep(2000); // Hilo entra en estado TIMED_WAITING
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("Hilo completado.");
    }

    public static void main(String[] args) throws InterruptedException {
        CicloCompletoHilo hilo = new CicloCompletoHilo();

        // Estado NEW
        System.out.println("Estado inicial: " + hilo.getState());

        // Iniciar el hilo (pasa a RUNNABLE)
        hilo.start();
        System.out.println("Después de start(): " + hilo.getState());

        // Dar tiempo para que el hilo entre en TIMED_WAITING
        Thread.sleep(100);
        System.out.println("Mientras duerme: " + hilo.getState());

        // Esperar a que el hilo termine
        hilo.join();
        System.out.println("Estado final: " + hilo.getState());
    }
}

Salida esperada

Estado inicial: NEW
Después de start(): RUNNABLE
Mientras duerme: TIMED_WAITING
Hilo completado.
Estado final: TERMINATED