Está en la página 1de 47

UNIDAD IV

PROGRAMACIN CONCURRENTE (MULTIHILOS)


ISC
TPICOS AVANZADOS DE PROGRAMACIN

INTRODUCCIN
Cuando se escribe un programa, en la mayora de los lenguajes de programacin, es necesario decidir el procesador y sistema operativo en los que se va a ejecutar, porque stos lenguajes incluyen llamadas a funciones especficas de una biblioteca asociada al sistema operativo de la plataforma destino.
Cuando se est preparado para probar el programa, se enva el cdigo fuente a un compilador que lo transforma en un conjunto de instrucciones propias de la plataforma destino. Por ejemplo, Windows se ejecuta generalmente en un procesador Intel, como un Pentiunm, mientras que los Macintosh utilizan procesadores Motorola 68000 o PowerPC.

MSC. JOS ALBERTO VILLALOBOS SERRANO

INTRODUCCIN
Cuando se escribe en Java, no necesitamos pensar en llamadas a Windows, Mac OS, u otras bibliotecas del sistema operativo. Java tiene sus propias bibliotecas, llamadas paquetes, que son independientes de la plataforma.
Por ello no es necesario preocuparse si la aplicacin se va a ejecutar en una plataforma Intel, una PowerPC o una SPARC. El compilador de Java no genera instrucciones nativas, en su lugar genera los llamados "cdigo de byte" (byte code) para la Mquina Virtual Java (Java Virtual Machine o JVM), que es una mquina que no existe fsicamente.
MSC. JOS ALBERTO VILLALOBOS SERRANO

INTRODUCCIN
Sun Microsystems (creadores de Java) y otras empresas han desarrollado versiones software de la JVM para una gran parte de las plataformas existentes en el mercado, es decir cada plataforma tiene su propia mquina virtual de Java, y es sta la que ejecuta los byte code.
En Java podemos distinguir dos tipos de programas, las aplicaciones autosuficientes que son conocidas como aplicaciones y los que se ejecutan con la ayuda de otro programa (un navegador Web), que se conocen como applets.

MSC. JOS ALBERTO VILLALOBOS SERRANO

4.1. CONCEPTO DE HILO

El multihilo soportado en Java gira alrededor del concepto de hilo. La cuestin es, qu es un hilo? De forma sencilla, un hilo es un nico flujo de ejecucin dentro de un proceso. Pero ser mejor comenzar desde el principio, un proceso es un programa ejecutndose dentro de su propio espacio de direcciones. lava es un sistema multiproceso, esto significa que soporta varios procesos corriendo a la vez dentro de sus propios espacios de direcciones. Estamos ms familiarizados con el trmino multitarea, el cual describe un escenario muy similar al multiproceso.

MSC. JOS ALBERTO VILLALOBOS SERRANO

4.1. CONCEPTO DE HILO

Por ejemplo, consideremos la cantidad de aplicaciones que corren a la vez dentro de un mismo entorno grfico. Mientras escribo esto, est corriendo Microsoft Word adems de Internet Explorer, Windows Explorer, CD Player y el Volumen Control. Estas aplicaciones son todas procesos ejecutados dentro de Windows 98. De esta forma, se puede pensar que los procesos son anlogos a las aplicaciones o a programas aislados, pero cada proceso tiene asignado espacio propio de ejecucin dentro del sistema.

MSC. JOS ALBERTO VILLALOBOS SERRANO

4.1. CONCEPTO DE HILO

Un hilo es una secuencia de cdigo en ejecucin dentro del contexto de un proceso. Los hilos no pueden ejecutarse ellos solos; requieren la supervisin de un proceso padre para correr.
Dentro de cada proceso hay varios hilos ejecutndose. Por ejemplo, Word puede tener un hilo en background chequeando automticamente la gramtica de lo que estoy escribiendo, mientras otro hilo puede estar salvando automticamente los cambios del documento en el que estoy trabajando.
MSC. JOS ALBERTO VILLALOBOS SERRANO

4.1. CONCEPTO DE HILO

Como Word, cada aplicacin (proceso) puede correr varios hilos los cuales estn realizando diferentes tareas. Esto significa que los hilos estn siempre asociados con un proceso en particular.

MSC. JOS ALBERTO VILLALOBOS SERRANO

4.1. CONCEPTO DE HILO

Los hilos a menudo son conocidos o llamados procesos ligeros. Un hilo, en efecto, es muy similar a un proceso pero con la diferencia de que un hilo siempre corre dentro del contexto de otro programa. Por el contrario, los procesos mantienen su propio espacio de direcciones y entorno de operaciones. Los hilos dependen de un programa padre en lo que se refiere a recursos de ejecucin

MSC. JOS ALBERTO VILLALOBOS SERRANO

4.1. CONCEPTO DE HILO

Java es un lenguaje de programacin que incorpora hilos en el corazn del mismo lenguaje. Comnmente, los hilos son implementados a nivel de sistema, requiriendo una interfaz de programacin especfica separada del ncleo del lenguaje de programacin. Esto es lo que ocurre con CIC++ programando en Windows, porque se necesita usar la interfaz de programacin Win32 para desarrollar aplicaciones Windows multihilo.
MSC. JOS ALBERTO VILLALOBOS SERRANO

4.1. CONCEPTO DE HILO

Java se presenta como ambos, como lenguaje y como sistema de tiempo de ejecucin (runtime), siendo posible integrar hilos dentro de ambos. El resultado final es que se pueden usar hilos Java como standard, en cualquier plataforma.

MSC. JOS ALBERTO VILLALOBOS SERRANO

Clases Relacionadas con los Hilos

El lenguaje de programacin Java proporciona soporte para hilos a travs de una simple interfaz y un conjunto de clases. La interfaz de Java y las clases que incluyen funcionalidades sobre hilos son las siguientes: Thread Runnable Object Thread

MSC. JOS ALBERTO VILLALOBOS SERRANO

Clases Relacionadas con los Hilos


Thread La clase Thread es la clase responsable de producir hilos funcionales para otras clases. Para aadir la funcionalidad de hilo a una clase simplemente se deriva la clase de Thread y se ignora el mtodo run. Es en este mtodo run donde el procesamiento de un hilo toma lugar, ya menudo se refieren a l como el cuerpo del hilo. La clase Thread tambin define los mtodos start y stop, los cuales te permiten comenzar y parar la ejecucin del hilo, adems de un gran nmero de mtodos tiles.

MSC. JOS ALBERTO VILLALOBOS SERRANO

Clases Relacionadas con los Hilos


Runnable Java no soporta herencia mltiple de forma directa, es decir, no se puede derivar una clase de varias clases padre. Esto nos plantea la duda sobre cmo podemos aadir la funcionalidad de Hilo a una clase que deriva de otra clase, siendo sta distinta de Thread. Para lograr esto se utiliza la interfazRunnable.

La interfaz Runnable proporciona la capacidad de aadir la funcionalidad de un hio a una clase simplemente implementando la interfaz, en lugar de derivndola de la clase Thread.
MSC. JOS ALBERTO VILLALOBOS SERRANO

Clases Relacionadas con los Hilos

Las clases que implementan la interfaz Runnable proporcionan un mtodo run que es ejecutado por un objeto hilo asociado que es creado aparte.
Esta es una herramienta muy til y a menudo es la nica salida que tenemos para incorporar multihilo dentro de las clases. Esta cuestin ser tratada ms ampliamente en el apartado de Creacin de hilos.

MSC. JOS ALBERTO VILLALOBOS SERRANO

Clases Relacionadas con los Hilos


Object Aunque, estrictamente hablando, no es una clase de apoyo a los hilos, la clase objeto proporciona unos cuantos mtodos cruciales dentro de la arquitectura multihilo de Java. Estos mtodos son wait, notify y notifyAll. El mtodo wait hace que el hilo de ejecucin espere en estado dormido hasta que se le notifique que contine.

MSC. JOS ALBERTO VILLALOBOS SERRANO

Clases Relacionadas con los Hilos

Del mismo modo, el mtodo notify informa a un hilo en espera de que contine con su ejecucin. El mtodo notifyAll es similar a notify excepto que se aplica a todos los hilos en espera. Estos tres mtodos solo pueden ser llamados desde un mtodo o bloque sincronizado (o bloque de sincronizacin).

MSC. JOS ALBERTO VILLALOBOS SERRANO

4.2. COMPARACIN DE UN PROGRAMA DE FLUJO NICO CONTRA UNO DE FLUJO MLTIPLE

Programas De Flujo Unico

Un programa de flujo nico, tarea nica o mono -hilo (singlethread) utiliza un nico flujo de control (thread) para controlar su ejecucin. Muchos programas no necesitan la potencia o utilidad de multiples tareas. sin necesidad para especificar explicitamente que se quiere un nico flujo de control, muchos de los applets y aplicaciones son de flujo nico.

Por ejemplo, en la aplicacin estdar de saludo para aprender cualquier lenguaje de programacin:
MSC. JOS ALBERTO VILLALOBOS SERRANO

4.2. COMPARACIN DE UN PROGRAMA DE FLUJO NICO CONTRA UNO DE FLUJO MLTIPLE

public class HolaMundo{ public static void main (string args[]){ System.out.println( " Hola Mundo " ); } }

MSC. JOS ALBERTO VILLALOBOS SERRANO

4.2. COMPARACIN DE UN PROGRAMA DE FLUJO NICO CONTRA UNO DE FLUJO MLTIPLE

Aqui, Cuando se llama al main(), la aplicacin imprime el mensaje y termina. Esto ocurre dentro de una nica tarea (thread).
Debido aque la mayor parte de los entornos operativos no solan ofrecer un soporte razonable para mltiples tarea, los leguajes de programacin tradicionales, tales como c++, no incorporaron mecanimos para describir de manera elegante situaciones de este tipo.

MSC. JOS ALBERTO VILLALOBOS SERRANO

4.2. COMPARACIN DE UN PROGRAMA DE FLUJO NICO CONTRA UNO DE FLUJO MLTIPLE

La sincronizacin entre las mltiples partes de un programa se lleba a cabo a medida de un bucle de sucecion nico. Estos entornos son de tipo sncrono, gestionados por sucesos. Entornos tales como el de MacOs de Apple,Windows de Microsft y X11/Motif fueron diseados al entorno del bucle del suceso.

MSC. JOS ALBERTO VILLALOBOS SERRANO

4.2. COMPARACIN DE UN PROGRAMA DE FLUJO NICO CONTRA UNO DE FLUJO MLTIPLE

PROGRAMAS DE FLUJO MLTIPLE

En la aplicacin de Saludo, no se ve la tarea que est ejecutando el programa. Sin embargo, java posibilita la creacin de tareas explcitamente. La utilizacin de las tareas (threads) en java permite una enorme flexibilidad a los programadores a la hora de plantearse el desarrollo de aplicaciones. La simplicidad para crear, configurar y ejecutar tareas permite que se puedan implementar muy poderosas y portables aplicaciones/applets que no se pueden crear con lenguajes de tercera generacin. En un lenguaje orientado a Internet como es Java, esta herramienta es vital.
MSC. JOS ALBERTO VILLALOBOS SERRANO

4.2. COMPARACIN DE UN PROGRAMA DE FLUJO NICO CONTRA UNO DE FLUJO MLTIPLE

Si el lector a utilizado un navegador con soporte en Java, ya habr visto el uso de mltiples tareas en Java. Habr observado que dos applets se pueden ejecutar al mismo tiempo, o bien que puede desplazar la pgina del navegador mientras el applet contina ejecutndose. Esto no significa que el applet utilice mltiples tareas, sino que el navegador es multitareas, multihilo, multihilvanado o multithreaded
MSC. JOS ALBERTO VILLALOBOS SERRANO

4.2. COMPARACIN DE UN PROGRAMA DE FLUJO NICO CONTRA UNO DE FLUJO MLTIPLE

Los navegadores utilizan diferentes tareas ejecutndose en paralelo para realizar varias tareas,"aparentemente" de forma concurrente. Por ejemplo, en muchas pginas Web se puede desplazar la pgina e ir leyendo el texto antes de que todas la imgenes estn presentes en la pantalla. En este caso, el navegador est descargando las imagenes en una tarea y soportando el desplazamiento de la pgina en otra tarea diferente.
MSC. JOS ALBERTO VILLALOBOS SERRANO

4.2. COMPARACIN DE UN PROGRAMA DE FLUJO NICO CONTRA UNO DE FLUJO MLTIPLE

Las aplicaciones (y applets) multitarea utiliza muchos contextos de ejecucin para cumplir su trabajo. Se aprovecha del hecho de que muchas tareas contienen subtareas distintas e independientes. Se puede utilizar un hilo de ejecucin para cada subtarea.

Mientras que los programas de flujo nico pueden realizar su tarea ejecutando las subtareas secuencialmente, un programa multitarea permite que cada tarea comience y termine tan pronto como sea posible. Este comportamiento presenta una mejor respuesta a la entrada en tiempo real.
MSC. JOS ALBERTO VILLALOBOS SERRANO

4.2. COMPARACIN DE UN PROGRAMA DE FLUJO NICO CONTRA UNO DE FLUJO MLTIPLE


import java.awt.*; import java.awt.event.*; import java.io.*;
class TestTh extends Thread { private String nombre; private int retardo; // Constructor para almacenar nuestro nombre y el retraso public TestTh( String s,int d) { nombre = s; retardo = d; } //El mtodo run() es similar al main(), pero para threads. Cuando // run() termina el thread muere public void run( ) { // Retrasamos la ejecucin el tiempo especificado try { sleep( retardo ); } catch( InterruptedException e ) { ; }

/ Ahora imprimimos el nombre System.out.println(" Hola Mundo! " +nombre+ " " +retardo ); } }
public class MultiHola{ public static void main (String args[ ] ) { TestTh t1,t2,t3; //Creamos los threads t1 = new TestTh(" Thread 1", (int)(Math.random()*2000) ); t2 = new TestTh("Thread 2",(int)(Math.random()*2000) ); t3 = new TestTh("Thread 3",(int)(Math.random()*2000)); //Arrancamos las threads t1.start(); t2.start(); t3.start(); } }

MSC. JOS ALBERTO VILLALOBOS SERRANO

4.3. CREACIN Y CONTROL DE HILOS

En Java, los hilos comparten el mismo espacio de memoria. Incluso comparten gran parte del entorno de ejecucin, de modo que la creacin de nuevos hilos es mucho ms rpida que la creacin de nuevos procesos.
La ventaja que proporcionan los hilos es la capacidad de tener ms de un camino de ejecucin en un mismo programa. As, con un nico proceso, ejecutndose una JVM (Java Virtual Machine), habr siempre ms de un hilo, cada uno con su propio camino de ejecucin.

MSC. JOS ALBERTO VILLALOBOS SERRANO

En cuanto al proceso de creacin de hilos, son dos los mecanismos que nos permiten llevarlo a cabo en Java: implementando la interfaz Runnable, o extendiendo la clase Thread, esto es, creando una subclase de esta clase.

MSC. JOS ALBERTO VILLALOBOS SERRANO

Lo ms habitual es crear hilos implementando la interfaz Runnable, dado que las interfaces representan una forma de encapsulamiento del trabajo que una clase debe realizar.
As, se utilizan para el diseo de requisitos comunes a todas las clases que se tiene previsto implementar. La interfaz define el trabajo, la funcionalidad que debe cubrirse, mientras que la clase o clases que implementan la interfaz realizan dicho trabajo (cumplen esa funcionalidad).
MSC. JOS ALBERTO VILLALOBOS SERRANO

Todas las clases o grupos de clases que implementen una cierta interfaz debern seguir las mismas reglas de funcionamiento.
El otro mecanismo de creacin de hilos, como ya hemos dicho, consistira en la creacin previa de una subclase de la clase Thread, la cual podramos instanciar despus.

MSC. JOS ALBERTO VILLALOBOS SERRANO

Por ejemplo: class MiThread extends Thread { public void run() { ... } }
Se corresponde con la declaracin de un clase, MiThread, que extiende la clase Thread, sobrecargando el mtodo Thread.run heredado con su propia implementacin.
MSC. JOS ALBERTO VILLALOBOS SERRANO

Es en el mtodo run donde se implementa el cdigo correspondiente a la accin (la tarea) que el hilo debe desarrollar . El mtodo run no es invocado directa o explcitamente (a menos que no quieras que se ejecute dentro de su propio hilo).
En lugar de esto, los hilos se arrancan con el mtodo start, se suspenden con el mtodo suspend, se reanudan con el mtodo resume, y se detienen con el mtodo stop (el cual supone tambin la muerte del hilo y la correspondiente excepcin Thread Death?), como ya explicaremos en el apartado de Estado y Control de Hilos. Un hilo suspendido puede reanudarse en la instruccin del mtodo run en la que fue suspendido.

MSC. JOS ALBERTO VILLALOBOS SERRANO

En el caso de crear un hilo extendiendo la clase Thread, se pueden heredar los mtodos y variables de la clase padre. Si es as, una misma subclase solamente puede extender o derivar una vez de la clase padre Thread. Esta limitacin de Java puede ser superada a travs de la implementacin de Runnable. Veamos el siguiente ejemplo:
MSC. JOS ALBERTO VILLALOBOS SERRANO

public class Mi Thread implements Runnable { Thread t; public void run() { // Ejecucin del thread una vez creado } }

MSC. JOS ALBERTO VILLALOBOS SERRANO

En este caso necesitamos crear una instancia de Thread antes de que el sistema pueda ejecutar el proceso como un hilo. Adems, el mtodo abstracto run que est definido en la interfaz Runnable tiene que implementarse en la nueva clase creada.
La diferencia entre ambos mtodos de creacin de hilos en Java radica en la flexibilidad con que cuenta el programador, que es mayor en el caso de la utilizacin de la interfaz Runnable.

MSC. JOS ALBERTO VILLALOBOS SERRANO

Sobre la base del ejemplo anterior, se podra extender la clase Mi Thread a continuacin, si fuese necesario. La mayora de las clases creadas que necesiten ejecutarse como un hilo implementarn la interfaz Runnable, ya que as queda cubierta la posibilidad de que sean extendidas por otras clases.

MSC. JOS ALBERTO VILLALOBOS SERRANO

Por otro lado, es un error pensar que la interfaz Runnable est realizando alguna tarea mientras un hilo de alguna clase que la implemente se est ejecutando.
Es una interfaz, y como tal, slo contiene funciones abstractas (concretamente una nica, run), proporcionando tan solo una idea de diseo, de infraestructura, de la clase Thread, pero ninguna funcionalidad. Su declaracin en Java tiene el siguiente aspecto:

MSC. JOS ALBERTO VILLALOBOS SERRANO

package Java.lang; public interfaz Runnable { public abstract void run() ; }

MSC. JOS ALBERTO VILLALOBOS SERRANO

Control de un hilo
En el contexto de las aplicaciones, sabemos que es main la primera funcin que se invoca tras arrancar, y por tanto, lgicamente, es el lugar ms apropiado para crear y arrancar otros hilos.
La lnea de cdigo: t1 = new Test Th?( Thread 1,(int)(Math.random()*2000) );

MSC. JOS ALBERTO VILLALOBOS SERRANO

Siendo Test Th una subclase de la clase Thread (o una clase que implemente la interfaz Runnable) crea un nuevo hilo. Los dos argumentos pasados, sin mayor relevancia, satisfarn el prototipo del constructor de la clase y se utilizarn para la inicializacin del objeto.
Al tener control directo sobre los hilos, tenemos que arrancarlos explcitamente. Como ya se coment anteriormente, es la funcin miembro start la que nos permite hacerlo. En nuestro ejemplo sera: t1.start();

start, en realidad es un mtodo oculto en el hilo que llama al mtodo run.


MSC. JOS ALBERTO VILLALOBOS SERRANO

Manipulacin de un hilo

Si todo fue bien en la creacin del objeto Test Th (t1), ste debera contener un hilo, una traza de ejecucin vlida, que controlaremos en el mtodo run del objeto.
El cuerpo de esta funcin miembro viene a ser el cuerpo de un programa como ya los conocemos. Digamos que es la rutina main a nivel de hilo. Todo lo que queremos que haga el hilo debe estar dentro del mtodo run. Cuando finalice run, finalizar tambin el hilo que lo ejecutaba.

MSC. JOS ALBERTO VILLALOBOS SERRANO

Suspensin de un Hilo

La funcin miembro suspend de la clase Thread permite tener un control sobre el hilo de modo que podamos desactivarlo, detener su actividad durante un intervalo de tiempo indeterminado, a diferencia del uso de la llamada al sistema sleep, que simplemente lleva al hilo a un estado de dormido, y siempre durante un nmero de milisegundos concreto.
Este mtodo puede resultar til si, construyendo un applet con un hilo de animacin,queremos permitir al usuario detener (que no finalizar) la animacin, hasta que ste decida reanudarla.
MSC. JOS ALBERTO VILLALOBOS SERRANO

Este mtodo no detiene la ejecucin permanentemente. El hilo es suspendido indefinidamente y para volver a activarlo de nuevo necesitamos realizar una invocacin a la funcin miembro resume.

MSC. JOS ALBERTO VILLALOBOS SERRANO

Parada de un Hilo

Ya conocemos los mtodos de control de hilos que nos permiten arrancarlos, suspenderlos y reanudarlos. El ltimo elemento de control que se necesita sobre hilos es el mtodo stop, utilizado para terminar la ejecucin de un hilo de forma permanente:

t1.stop();

MSC. JOS ALBERTO VILLALOBOS SERRANO

Sealar que esta llamada no destruye el hilo, sino que detiene su ejecucin, y sta no puede reanudarse con el mtodo start. Cuando se desasignen las variables que se usan en el hilo, el objeto hilo (creado con new) quedar marcado para eliminarlo y el garbage collector (recolector de basura de Java) se encargar de liberar la memoria que utilizaba. Tiene sentido su utilidad, por ejemplo, en aplicaciones complejas que necesiten un control sobre cada uno de los hilos que se lancen.

MSC. JOS ALBERTO VILLALOBOS SERRANO

Por ltimo, un mtodo de control de hilos que nos permite comprobar si una instancia est viva (el hilo se ha arrancado y an no se ha detenido) o no (bien no se arranc; bien ya finaliz).
Estamos hablando de la funcin miembro isAlive.

MSC. JOS ALBERTO VILLALOBOS SERRANO

t1.isAlive();

Devolver true en caso de que el hilo t1 est vivo, es decir, ya se haya llamado a su mtodo run y no haya sido parado con un stop ni haya terminado el mtodo run en su ejecucin. En otro caso, lgicamente, devolver false.

MSC. JOS ALBERTO VILLALOBOS SERRANO