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:
- Está esperando por un recurso bloqueado (como un objeto sincronizado).
- 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