Beruflich Dokumente
Kultur Dokumente
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.
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.
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.
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.
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
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.
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
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
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.
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
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
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.
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).
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
public class HolaMundo{ public static void main (string args[]){ System.out.println( " Hola Mundo " ); } }
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.
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.
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
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
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
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
/ 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(); } }
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.
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.
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.
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.
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 } }
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.
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.
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:
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) );
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();
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.
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.
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();
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.
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.
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.