Você está na página 1de 6

Universidad Nacional de San Antonio Abad del Cusco Departamento Acadmico de Informtica Programacin Concurrente y Distribuida

Prctica N 1
Programacin Multihilo en Java
Ing. Ivn Medrano Valencia 1. OBJETIVO. Comprender el concepto de multihilado. Aprender a crear, manejar y destruir hilos. Entender el ciclo de vida de un hilo. 2. BASE TEORICA COMPLEMENTARIA CONCEPTO DE HILO (Thread). Un proceso es un programa en ejecucin que es localizado en la memoria por el sistema operativo. Un hilo es una ejecucin o flujo de control en el espacio de direcciones de un proceso. Un proceso puede tener mas de un hilo. Todos los hilos en un proceso tienen su propio contador de programa y su propia pila para variables locales y direcciones de retorno de invocacin de procedimientos. En la figura observamos cmo sobre una CPU pueden estar ejecutndose distintos procesos pesados y uno de ellos puede estar compuesto por distintos flujos de ejecucin (threads o hebras o hilos). Estas threads tendrn que disputarse el tiempo de ejecucin que el S.O. le d al proceso en el que residen.

CLASE Thread DE JAVA . Construccin La clase Thread (hilo) tiene varios constructores. El constructor: public Thread ( String nombreHilo ) Construye un hilo cuyo nombre es nombreHilo. El constructor:

Programacin Concurrente y Distribuida

Multihilado

public Thread () Construye un hilo cuyo nombre es Thread concatenado con un dgito, como Thread1, Thread2, etc. Ejecucin La invocacin al mtodo start() hace que la instancia de la clase Thread inicie la ejecucin del mtodo run() como una actividad independiente. Un Thread termina cuando su mtodo run() se completa, ya sea retornando o bien lanzando una excepcin no controlada (es decir, RuntimeException, Error, o una de sus subclases). Si se invoca start() ms de una vez provoca una InvalidThreadStateException. Prioridades. Para hacer posible la implementacin de la mquina virtual de Java sobre distintas plataformas hardware y sistemas operativos, el lenguaje de programacin Java no hace ninguna promesa sobre la planificacin o equitatividad, y no garantizar estrictamente que los hilos progresen. Pero los hilos proporcionan mtodos para el control de la prioridad que heursticamente influyen sobre los planificadores: Cada Thread tiene una prioridad cuyo rango se extiende de Thread.MIN_PRIORITY a Thread.MAX_PRIORITY (definidos como 1 y 10 respectivamente). Por defecto, cada hilo nuevo tiene la misma prioridad que el hilo que lo cre . El hilo inicial asociado con main() por defecto tiene prioridad Thread.NORM_PRIORITY(5). La prioridad actual de cualquier hilo se puede obtener por medio del mtodo getPriority(). La prioridad de cualquier hilo se puede cambiar dinmicamente por medio del mtodo setPriority(). Mtodos de control. Algunos mtodos de control de los hilos son: sleep(). Se invoca con argumento que especifica durante cunto tiempo el hilo que se est ejecutando debe dormir en segundos. setName(). Establece el nombre del hilo. getName(). Devuelve el nombre del hilo. isAlive(). Retorna true si el hilo se ha iniciado pero no ha terminado. Retornar true si el hilo est bloqueado de alguna forma y false si fue cancelado o terminado. join(). Hace que el hilo actual espere hasta que el hilo al que se envi el mensaje muera antes de continuar; si no se proporciona argumento o el argumento es de 0 milisegundos, se est especificando que el hilo debe esperar indefinidamente a que muera el hilo objetivo antes de que el hilo actual contine. wait(). Cuando un hilo en ejecucin llama a wait(), el hilo pasa al estado en espera, donde espera en una cola asociada al objeto especfico para el cual invoc wait()

Programacin Concurrente y Distribuida

Multihilado

notify(). El primer hilo de la cola de espera para un objeto en particular queda preparado cuando otro hilo asociado a ese objeto emite una llamada notify(). notifyAll(). Todos los hilos de la cola de espera para un objeto dado quedan preparados cuando otro hilo asociado a ese objeto emite una llamada notifyAll()

CICLO DE VIDA DE UN HILO EN JAVA En cualquier instante un hilo puede estar en uno de los siguientes estados.

Creado start()

Preparado Expropiado Planificado Termin tiempo

Ocurri evento de E/S

notify() notifyAll()

Activo wait() sleep() stop() Terminado Esperando Durmiendo Muerto Bloqueado Espera evento de E/S

TCNICAS DE IMPLEMENTACION DE HILOS EN JAVA. Por herencia


public class X extends Thread {... public x() {... } public void run() {....} .... } public class Principal //--aplicacin { static X x1; static X x2; public static void main(String arg[]) throws InterruptedException {

Programacin Concurrente y Distribuida x1 = new X(); x2 = new X(); x1.start(); x2.start(); ... } }

Multihilado

Por implementacin de interfase


import java.io.* class X implements Runnable { public X() {...} public void run() { ..... } ..... } class Principal //--aplicacin { public static void main(String arg[]) throws InterruptedException { Thread x1 = new Thread(new x()); Thread x2 = new Thread(new x()); x1.start(); x2.start(); } }

3. DESARROLLO DE LA PRACTICA Veamos un ejemplo en el que una clase crea dos hilos y los lanza a ejecucin. Ambos hilos imprimen una palabra pero con distintos intervalos de tiempo. La palabra a imprimir y el intervalo de tiempo son parmetros del constructor de la clase. En este ejemplo se puede apreciar cmo se entremezcla la ejecucin de ambos hilos de ejecucin.
//--POR HERENCIA class HiloHerencia extends Thread { String palabra; //-- palabra a imprimir long pausa; public HiloHerencia (String queDecir, long tiempoPausa) { palabra = queDecir; pausa = tiempoPausa; } public void run( ) { try { for (int i=0;i<100;i++) { System.out.println (palabra+ " "); Thread.sleep(pausa); } } catch(InterruptedException e) {

Programacin Concurrente y Distribuida } } } //--APLICACIN DE HILOS POR HERENCIA public class AppHiloHerencia { public static void main(java.lang.String[] args) { HiloHerencia hilo1; HiloHerencia hilo2; hilo1=new HiloHerencia("ton",33); hilo2=new HiloHerencia("tin",100); hilo1.start(); hilo2.start(); } } //--IMPLEMENTANDO LA INTERFAZ Runnable public class HiloRunnable implements Runnable { String palabra; //--palabra a imprimir long pausa; public HiloRunnable (String queDecir,long tiempoPausa) { palabra = queDecir; pausa = tiempoPausa; } public void run( ) { try { for (int i=0;i<100;i++) { System.out.println (palabra+ " "); Thread.sleep(pausa); } } catch(InterruptedException e) { } } } //--APLICACION DE HILOS DE INTERFAZ RUNNABLE public class AppHiloRunnable { public static void main (String args[])throws InterruptedException { //--crear hilos HiloRunnable ton = new HiloRunnable ("ton",33); HiloRunnable tin = new HiloRunnable ("tin",100); Thread hilo1 = new Thread (ton); Thread hilo2 = new Thread (tin); //--ejecutar los hilos hilo1.start(); hilo2.start(); } }

Multihilado

Programacin Concurrente y Distribuida

Multihilado

4. CUESTIONARIO a. Demuestre la utilizacin de los mtodos join(), setPriority(), getPriority, setName(), getName(), stop(), isAlive(); 5. TRABAJO. a. Escriba un programa en java que muestre un recuadro en el que varias pelotas estn en movimiento. Cuando una pelota llegue al final del recuadro deber moverse en la direccin opuesta. 6. BIBLIOGRAFA. Doug Lea Deitel & Deitel Ken Arnold James Goslin David Holmes

Programacin Concurrente en Java 2da. Edicin. Addison Wesley 2001. JAVA How to Program 3ra. Edicin Prentice Hall 1999. El Lenguaje de Programacin JAVA. 3ra. Edicin. Addison Wesley 2001

Cusco, enero de 2008

Você também pode gostar