Hilos-programacion
dairohernanposso11 de Febrero de 2015
5.497 Palabras (22 Páginas)533 Visitas
SERVICIO NACIONAL DE APRENDIZAJE
SENA
CONOCIMIENTO PARA TODOS LOS COLOMBIANOS
ACTIVIDAD UNIDAD 1
AUTOR:
DAIRO HERNAN DURANGO POSSO
DESARROLLO DE APLICACIONES CON MANEJO DE PROCESO SIMULTÁNEO Y USO DE MENÚS
COLOMBIA 2014
¿QUÉ SON LOS HILOS?
Primero definamos hilo, es un proceso de ejecución también llamado proceso liviano como contraparte a multiproceso que usa programas que se denominan procesos pesados, un hilo es un flujo secuencial de instrucciones pero que está dentro de un programa, no es un programa independiente, es decir, un hilo forma parte de un programa.
Contexto de ejecución, proceso liviano (lightweight).
Un flujo secuencial de instrucciones dentro de un programa .
MULTIPROCESO VS MULTIHILOS
Como mencionamos un hilo es un proceso liviano, para entender esto necesitamos hacer la separación en lo que es multiproceso y lo que es multihilo.
En multiproceso tenemos dos o más programas independientes que se ejecutan en forma paralela esta ejecución paralela no es tal, en el caso de que tengamos un procesador en una máquina, como todos sabemos es imposible tener ejecución paralela, pero para el usuario se puede ver como una ejecución en paralelo, además en multiproceso, cada programa tiene su propio espacio de memoria, su propio conjunto de variables, sus propios recursos, el control para ver que programa se está ejecutando en determinado momento lo tiene el sistema operativo, el programador no tiene ninguna ingerencia al respecto.
En programación multihilo, que lo podemos definir como dos o más tareas ejecutándose en forma paralela dentro de un programa, estas tareas comparten los recursos del programa es decir las variables definidas para el programa son compartidas por las dos o más tareas que se están ejecutando, esto trae una responsabilidad para el programador por que el control para el acceso de recursos, lo tiene el programa y esto es un punto delicado que veremos más adelante. Así es que debe de quedar claro lo que es programación multiproceso y programación multihilo, la programación multihilo deja más responsabilidad al programador y tenemos que saber ciertas cosas para que se realice en forma adecuada.
Multiproceso:
- Dos o más programas (procesos) independientes ejecución en forma "paralela".
- Cada proceso tiene su propio espacio de memoria, su propio conjunto de variables, su propia pila, etc.
- El control lo tiene el sistema operativo.
Multihilo:
- Dos o más "tareas" ejecutándose en forma "paralela" dentro de un programa.
- Comparten los recursos del programa.
- El control lo tiene el programa.
En la figura, puedes ver un programa que tiene dos hilos ejecutándose en forma simultánea, como puedes ver, los hilos son parte del programa y ambos tienen acceso a los recursos del programa porque forman parte de este y no tienen al sistema operativo que controle este acceso, así es que es responsabilidad del programador controlar el acceso a estos recursos para que no se incurra en un estado inestable del programa como un todo.
Java, tiene el soporte natural para la programación multihilos, de hecho la máquina virtual de Java está programada en multihilos, lo que es el método main de un programa o el recolector de basura o las actualizaciones de pantalla, todas corren en su propio hilo, además de los hilos que tu crees y pongas a ejecutar, y repetiremos nuevamente el concepto de que en multiproceso cada programa es independiente y en multihilo no, en multihilo el programador tiene la responsabilidad de controlar el acceso a los recursos del programa, esto lo estamos repitiendo porque es tremendamente importante para evitar caer en problemas conocidos como deadlock y starvation
Antes de comenzar a programar hilos, es conveniente saber el por qué utilizarlos, una de las cosas principales es que puedes dejar ejecutando tareas en el fondo obackground como se les dice, esto te permite una programación múltiple más eficiente, es decir mientras realizas cuestiones lentas o que requieren entradas del usuario puedes poner a ejecutar alguna otra tarea; otra de las cosas es que evitas el bloqueo de un programa, esto es cuando un programa accesa a disco para leer un archivo relativamente grande, todos sabemos que el programa detiene su ejecución y se espera para que se termine la lectura de disco, lo que se puede hacer es mandar a ejecutar dicha lectura en un hilo y puedes continuar con tu programa, puedes hacer programas mucho más adecuados desde el punto de vista de servicio al usuario ya que cuando haces tareas que se tardan puedes realizar el despliegue de una barra de progreso, esto implica que estás realizando dos tareas; uno, la tarea tardada y la otra el despliegue de una barra de progreso que muy probablemente sea una animación.
Además se dice, y es verdad, la programación es mucho más estructurada y se ve mucho más elegante y si aprendes bien los procesos multihilo en Java, la programación va a ser más fácil. Y por último para aquellos que quieran utilizar animaciones, el uso de hilos es imprescindible ¿por qué?, porque por un lado quieres desplegar animación y por otro lado quieres procesar la entrada de algún usuario o estar haciendo otra cosa, en ese momento necesitas dos o más hilos ejecutándose simultáneamente en tu programa.
¿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
...