Hilos (Threads)

A continuación dejo el resumen del noveno capítulo (Threads) del libro "Sun Certified Programmer for Java 6 Study Guide".

Definición, instanciación e iniciación de Threads (hilos) (Objetivo 4.1):
  • Un hilo se puede crear extendiendo de la clase Thread y sobrescribiendo el método: public void run().
  • Los objetos Thread pueden ser creados invocando el constructor que toma un argumento de tipo Runnable. Un objeto Runnable es llamado “el blanco” (target) de un hilo.
  • Sobre un hilo se puede invocar solo una vez el método start(). Si el método se invoca más de una vez, se lanza una excepción de tipo IllegalThreadStateException (la cual extiende de RuntimeException).
  • Es legal crear muchas instancias Thread con el mismo objeto Runnable.
  • Cuando se instancia un objeto Thread, este no es un hilo de ejecución hasta que no se invoque el método start(). Cuando exista un objeto Thread que todavía no haya sido iniciado, este es considerado vivo (alive).
Transiciones entre estados de hilos (Objetivo 4.2):
  • Existen cinco estados: “nuevo”, “ejecutable”, “en ejecución”, “bloqueado/esperando/dormido”, y “muerto” (new, runnable, running, blocked/waiting/sleeping, dead).
  • Cuando se inicia un nuevo hilo, este siempre entra al estado “ejecutable”.
  • El programador de hilos puede mover un hilo de ejecución hacia los estados “ejecutable” y “en ejecución”.
  • En una maquina típica de un solo procesador, solo un hilo puede ser ejecutado a la vez, pero muchos hilos pueden estar en el estado “ejecutable”.
  • No está determinada la forma de ejecución de los hilos, ni siquiera por el orden en que se iniciaron.
  • La manera en que los hilos toman los turnos de ejecución no está garantizada de ninguna forma. El programador de hilos es el encargado de administrar esto, y la manera varía según la implementación de la JVM.
  • Un hilo en ejecución puede entrar en el estado “bloqueado/esperando/dormido” invocando algunos de los siguientes métodos: wait(), sleep() o join().
  • Un hilo en ejecución puede entrar en el estado “bloqueado/esperando/dormido” debido a que no puede adquirir la cerradura de un bloque de código sincronizado.
  • Cuando finalizan los efectos de los métodos wait() y sleep(), o cuando la cerradura de un objeto se encuentra disponible, el hilo solo puede volver al estado “ejecutable”.
  • Un hilo muerto no puede ser iniciado nuevamente.
Sleep, Yield y Join (Objetivo 4.2):
  • El método sleep() se utiliza para retardar la ejecución por un periodo de tiempo, durante dicho periodo las cerraduras no se liberan.
  • Se garantiza que un hilo estará dormido por lo menos, la cantidad de milisegundos especificados por el argumento de sleep() (a menos que sea interrumpido), pero no se puede garantizar cuando el mismo podrá ser ejecutado nuevamente.
  • El método estático Thread.sleep(), duerme el hilo de ejecución que invoca el método. Un hilo no puede dormir a otro hilo.
  • El método setPriority() se utiliza, solo sobre instancias de Thread, para dar una prioridad a los hilos entre los valores 1(baja) y 10(alta). Aunque no todas las JVM’s reconocen diez niveles de prioridades, debido a que depende de su implementación y del sistema operativo sobre el que se esté ejecutando.
  • Cuando no se especifica una prioridad para un hilo, este posee la misma prioridad que el hilo que lo creo.
  • El método yield() puede causar que se pare de ejecutar un hilo si existen otros hilos en el estado “ejecutable” con la misma prioridad. No se garantiza que cuando se ejecute el método será otro hilo el que se ejecutara. Es decir, un hilo puede salir y luego volver a entrar al estado “en ejecución”.
  • Lo que sí se puede garantizar es que cuando se está ejecutando un hilo, no habrá otros hilos con mayor prioridad en el estado “ejecutable”. Si en algún momento ingresa un nuevo hilo al estado “ejecutable” con mayor prioridad en relación al que se está ejecutando, la JVM pausará el hilo en ejecución para ejecutar el hilo con mayor prioridad.
  • Cuando un hilo invoca el método join() sobre otro hilo, el hilo en ejecución actual se detendrá hasta que el hilo al que se ha unido se complete. Es decir, el hilo se volverá a ejecutar al final de la ejecución del otro.
Problemas de acceso concurrente y sincronización de hilos (Objetivo 4.3):
  • Los métodos synchronized previenen que más de un hilo acceda al código de un método crítico simultáneamente.
  • Se puede utilizar la palabra clave synchronized como un modificador de un método, o como un iniciador de un bloque de código sincronizado.
  • Para sincronizar un bloque de código, se debe especificar un argumento que es el objeto que se utilizara como cerradura para la sincronización.
  • Mientras que solo un hilo puede acceder al código sincronizado de una instancia en particular, múltiples hilos pueden acceder al código no sincronizado de una misma instancia.
  • Cuando un hilo se duerme, su cerradura no se encuentra disponibles para otros hilos.
  • Los métodos estáticos pueden estar sincronizados, utilizando como cerradura la instancia java.lang.Class que representa la clase.
Comunicación con objetos a través de wait() y notify() (Objetivo 4.4):
  • El método wait() permite a un hilo pausar su ejecución hasta que se le notifique que ocurrió algo de lo que se tiene que encargar.
  • El método notify() se utiliza para enviar una señal a un y solo un hilo que se encuentra esperando en el pool de objetos en espera.
  • El método notify() no permite especificar que hilo en espera se va a notificar.
  • El método notifyAll() funciona del mismo modo que notify, a diferencia que envía señales a todos los hilos esperando por un objeto.
  • Los métodos wait(), notify() y notifyAll() deben ser invocados desde un contexto sincronizado.

0 comentarios:



Publicar un comentario

Este blog dejo de ser mantenido el día 12/02/2010. Para cualquier consulta o comentario realizarlo a través del sitio http://onj2ee.blogspot.com/