En el ejemplo anterior, Entrance::run() incluye una llamada a sleep() en el bucle principal. Sabemos que sleep() se despertará eventualmente y que la tarea llegará al principio del bucle donde tiene una oportunidad para salir de ese bucle chequeando el estado isPaused(). Sin embargo, sleep() es simplemente una situación donde un hilo en ejecución se bloquea, y a veces necesita terminar una tarea que está bloqueada.
Un hilo puede estar en alguno de los cuatro estados:
1. Nuevo: Un hilo permanece en este estado solamente de forma momentánea, tan solo cuando se crea. Reserva todos los recursos del sistema necesarios y ejecuta la inicialización. En este momento se convierte en FIXMEcandidato para recibir tiempo de CPU. A continuación, el planificador llevará a este hilo al estado de ejecución o de bloqueo.
2. Ejecutable: Esto significa que un hilo puede ser ejecutado cuando el mecanismo de fraccionador de tiempo tenga ciclos de CPU disponibles para el hilo. Así, el hilo podría o no ejecutarse en cualquier momento, pero no hay nada que evite FIXME
3. Bloqueado: El hilo pudo ser ejecutado, pero algo lo impidió. (Podría estar esperando a que se complete una operación de entrada/salida, por ejemplo.) Mientras un hilo esté en el estado de bloqueo, el planificador simplemente lo ignorará y no le dará tiempo de CPU. Hasta que un hilo no vuelva a entrar en el estado de ejecución, no ejecutará ninguna operación.
4. FIXMEMuerte: Un hilo en el estado de muerto no será planificable y no recibirá tiempo de CPU. Sus tareas han finalizado, y no será ejecutable nunca más. La forma normal que un hilo tiene para morir es volviendo de su función run().
Un hilo está bloqueado cuando no puede continuar su ejecución. Un hilo puede bloquearse debido a los siguientes motivos:
Puso el hilo a dormir llamando a sleep(milisegundos), en cuyo caso no será ejecutado durante el tiempo especificado.
Suspendió la ejecución del hilo con wait(). No volverá a ser ejecutable hasta que el hilo no obtenga el mensaje signal() o broadcast(). Estudiaremos esto en una sección más adelante.
El hilo está esperando a que una operación de entrada/salida finalice.
El hilo está intentando entrar en un bloque de código controlado por un mutex, y el mutex ha sido ya adquirido por otro hilo.
El problema que tenemos ahora es el siguiente: algunas veces quiere terminar un hilo que está en el estado de bloqueo. Si no puede esperar a que el hilo llegue a un punto en el código donde pueda comprobar el valor del estado y decidir si terminar por sus propios medios, debe forzar a que el hilo salga de su estado de bloqueo.