sábado, 14 de julio de 2012

5.1.2. ¿Por qué y cómo usar hilos?


¿Por qué usar hilos?
  •  Hacen un mejor uso de los recursos
    - Se pueden ejecutar en el fondo (background) mientras se espera por entrada del usuario.
  •  Evitan bloqueo del programa
    - Ejecutar tareas mientras se está leyendo de disco o se espera por una conexión de red.
  •  Programas más adecuados
    - Desplegar barra de progreso mientras se realiza alguna tarea tardada.
  •  Programación más elegante y "fácil"
    - Más estructuración en la programación
  •  "Imprescindible" para animaciones

El método run( )

  •  Método de la clase Thread, es el que realiza el trabajo, el que se llama para que arranque un hilo su ejecución.
  •  Este método es el que se tiene que redefinir (override) para que tu hilo haga algo.
  •  El método run en la clase Thread no hace nada
  •  Cuando un objeto tiene en ejecución el método run(), ese hilo esta compitiendo con los demás hilos activos por recursos del sistema (CPU).
  •  Cuando un objeto termina la ejecución de su método run( ), el hilo se "muere".
Como vamos a ver un poco más adelante, el método run es el corazón de un hilo, de hecho es el método que se ejecuta, es un método de la clase Thread,  es el método que tienes que redefinir para que tu hilo haga algo, lo que tu quieras que se ejecute como parte de un hilo tiene que ir dentro del método run. El método run original es decir el de la clase Thread no hace absolutamente nada, así es que eres tú el que tiene que programarlo.
Cuando un objeto que pertenece a una clase tiene en ejecución el método run, en ese momento en ese hilo no necesariamente se pone en ejecución sino, se dice que está compitiendo por CPU y está compitiendo por el CPU contra los otros hilos activos así es que tu puedes tener varios métodos run ejecutándose pero uno solo tendrá el CPU, todos están compitiendo por tiempo del CPU y lo último, bastante importante es que cuando termina la ejecución del método run el hilo se muere y ya no compite por el CPU por que simplemente no existe.  

Dos maneras de crear un hilo de ejecución

  •  Extender la clase Thread, reprogramando el método run ( ) que está vacío.
    - La manera natural de crear hilos.
  •  Implementar la interfaz Runnable, programando el método run ( ).
    - En caso de que los objetos que se quieren ejecutar en un hilo pertenezcan a una clase que extiende a otra
Antes de ver nuestros primero ejemplos, veamos un poco más de teoría, hay dos maneras de crear un hilo:
  •   una es extender la clase Thread, como ya dijimos la clase Thread tiene un método run que es el que tienes que reprogramar,
  •   la otra es implementar la interfaz runnable, la interfaz runnable tiene solamente un método definido que es el método run,
de las dos maneras que tenemos de crear un hilo, la primera, es decir extendiendo la clase Thread es la que más se utiliza, la segunda es simplemente en caso de que tengamos una clase donde queremos implementar la ejecución de hilos de esa clase ya extienda a otra, sería imposible que extendiéramos la clase Thread ya que en Java no se permite la herencia múltiple en este caso ayuda el hecho de tener una interfaz, por eso nos dan las dos maneras de crear hilos extendiendo la clase Thread o implementando la interfaz runnable, extender la clase Thread es la manera natural de crear hilos pero en caso de que sea imprescindible podemos usar la interfaz runnable.  

Arranque de un hilo

Por último, el arranque de hilos se realiza en dos pasos, primero creas un objeto de la clase Thread y en segundo lugar llamas al método run del objeto que acabas de crear. Un detalle es que la llamada al método run no es directa, lo que tienes que hacer es llamar al método start, este llamará a método run. Además hay algunos métodos auxiliares que nos permiten una programación más adecuada que usaremos en el ejemplo de la siguiente filmina, el método sleep que es de la clase Thread en una de sus versiones, permite un parámetro que es long, lo que hace esto es que el hilo el cual llama al método run deja de competir por el CPU durante la cantidad de milisegundos especificada en el parámetro, después de que ese tiempo pase, el hilo volverá a competir por el CPU, esto no garantiza que el hilo se comenzará a ejecutar inmediatamente, simplemente va a competir por el CPU con los otros hilos activos, al llamar a start, automáticamente hay dos hilos ejecutándose, el que arrancó con start y obviamente el que ejecutó la llamada, entonces cuando utilizas hilos, automáticamente siempre tienes por lo menos dos hilos compitiendo por el CPU. Veamos un ejemplo para aterrizar todos estos conceptos que hemos visto rápidamente.
  •  El arranque de hilos se realiza en dos pasos:
    -Crear un objeto  de la clase Thread.
    - Llamar al método run ( ) del objeto creado.
  •  La llamada al método run ( ) no se hace directamente, sino que se llama al método start ( ) del objeto, esto causa que la máquina virtual llame a run().
  •  El método sleep(long x) de la clase thread, ocasiona que el hilo deje de compartir por los recursos durante x milisegundos, después de ese tiempo, comienza a pelear por recursos otra vez.
  •  Al llamar a start, automáticamente hay dos hilos corriendo, el que se arranco con start ( ) y el que ejecutó la llamada. 

No hay comentarios:

Publicar un comentario en la entrada