hilos poo

39
Multiprocesamiento y Multitarea Estados de los hilos Creando hilos: clase Thread, interfaz Runnable Prioridad Palabra reservada sinchronized Programación Multi-Hilo 1 Rafael Aguilar García - ESCOM - POO Rafael Aguilar García

Upload: arturo-solano

Post on 16-Aug-2015

217 views

Category:

Documents


3 download

DESCRIPTION

Hilos en POO específicamente en Java, Una herramienta muy poderosa en la programación en general.

TRANSCRIPT

Multiprocesamiento y Multitarea Estados de los hilos Creando hilos: clase Thread, interfaz Runnable Prioridad Palabra reservada sinchronized Programacin Multi-Hilo 1 Rafael Aguilar Garca - ESCOM - POORafael Aguilar Garca Multiproceso y Multitarea Rafael Aguilar Garca - ESCOM - POO2 Multiproceso significa que el equipo hardware cuenta ms de un procesador (CPU) y por tanto ejecuta varias tareas a la vez. Multitarea significa que varias tareas comparten el nico procesador (CPU) dndonos la sensacin de multiproceso. La multitarea se consigue mediante un planificador de tareas que van dando slots de CPU a cada tarea. Rafael Aguilar Garca - ESCOM - POO3 Basada en procesos Basada en hilos Tipos de Programacin Multitarea Multitarea Basada en Procesos Rafael Aguilar Garca - ESCOM - POO4 El ordenador puede ejecutar dos o ms procesos de forma concurrente Un proceso es un programa en ejecucin. En este esquema, un proceso es la unidad ms pequea que un planificador puede seleccionar. Por ejemplo, la ejecucin del compilador Java al mismo tiempo que un editor de textos y que el navegador de web. Multitarea Basada en Procesos Rafael Aguilar Garca - ESCOM - POO5 Usada para tareas generales Son tareas pesadas Requieren ms recursos de la CPU La comunicacin entre procesos es costosa y limitadaEl intercambio de contextos de un proceso a otro es pesado Multitarea Basada en Hilos Rafael Aguilar Garca - ESCOM - POO6 Un proceso puede ejecutar dos o ms hilos, es decir, puede realizar dos o ms tareas simultneas. En este esquema el hilo es la unidad de cdigo ms pequea que se puede seleccionar. Por ejemplo, un editor de texto puede dar formato a un textoal mismo tiempo que est imprimiendo ya que estas acciones las realizan dos hilos distintos. Rafael Aguilar Garca - ESCOM - POO7 Multitarea - Basada en hilos Rafael Aguilar Garca - ESCOM - POO7 Unprogramamultihilocontienedosomspartes quesepuedenejecutardemaneraconcurrenteo simultnea. Cadapartedelprogramasedenominahilo (thread), y cada hilo define un camino de ejecucin independiente. Es una forma especializada de multitarea Programacin Multihilo Rafael Aguilar Garca - ESCOM - POO8 Programacin Multihilo Rafael Aguilar Garca - ESCOM - POO9 Un thread es un contexto de ejecucin, proceso ligero o tarea. Dentro de un programa pueden haber varios threads abiertos. Un thread es un proceso ligero en donde hay un flujo secuencial de control y que utiliza los recursos disponibles para un programa. Al ejecutar un programa Java pueden haber varios threads ejecutndose (manejo de eventos, main, ...). Programacin Multihilo Rafael Aguilar Garca - ESCOM - POO10 Ciclo de vida de un hilo Rafael Aguilar Garca - ESCOM - POO11 Creacin de un hilo Rafael Aguilar Garca - ESCOM - POO12 Heredando de la clase Thread Implementandola interfaz Runnable La clase Thread Rafael Aguilar Garca - ESCOM - POO13 MtodoDescripcin getNameObtiene el nombre de un hilo getPriorityObtiene la prioridad de un hilo isAliveDetermina si un hilo todava se est ejecutando joinEspera la terminacin de un hilo runPunto de entrada de un hilo sleepSuspende un hilo durante un perodo de tiempo startComienza la ejecucin de un hilo llamando a su mtodo run Algunos mtodos de la clase Thread: El hilo principal Rafael Aguilar Garca - ESCOM - POO14 Cuando un programa Java comienza su ejecucin, ya hay un hilo ejecutndose al cual denominamos hilo principal del programa,. Es el nico que se ejecuta al comenzar el programa. Es el hilo a partir del cual se crean el resto de los hilos del programa. Normalmente, debe ser el ltimo que finaliza su ejecucin. Cuando el hilo principal finaliza, el programa termina. El hilo principal Rafael Aguilar Garca - ESCOM - POO15 Aunque el hilo principal se crea automticamente cuando el programa comienza, podemos controlarlo a travs de un objeto Thread,obteniendo una referencia a partir delmtodo currentThread :

static Thread currentThread( ) Este mtodo devuelve una referencia al hilo desde donde fue llamado. Una vez obtenida la referencia del hilo principal, se puede controlar del mismo modo que cualquier otro hilo. Rafael Aguilar Garca - ESCOM - POO16 Ejemplo: Rafael Aguilar Garca - ESCOM - POO17 //Control de hilo principal public class DemoHiloActual { public static void main(String args[ ]) { Thread t = Thread.currentThread( ); System.out.printl(Hilo actual: + t); // Cambio del nombre del hilo t.setName(Mi Hilo); System.out.printl(Despus del cambio de nombre: + t); try { for( int n = 5, n > 0; n--) { System.out.println(n); Thread.sleep(1000); } } catch ( InterruptedException e) { System.out.println(Interrupcin del hilo principal); } } } Salida del programa anterior Rafael Aguilar Garca - ESCOM - POO18 Hilo actual: Thread[main,5,main] Despus del cambio de nombre: Thread[Mi Hilo,5,main] 5 4 3 2 1 Creacin de un hilo en Java Rafael Aguilar Garca - ESCOM - POO19 En un sentido amplio, se puede crear un hilo creando un objeto del tipo Thread. Java define dos formas en la que se puede hacer esto: Implementando la interfaz Runnable Extendiendo la propia clase Thread Implementando la interfaz Runnable Rafael Aguilar Garca - ESCOM - POO20 La forma ms fcil de crear un hilo es creando una clase que implemente la interfaz Runnable.Permite abstraer una unidad de cdigo ejecutable.Se puede construir un hilo sobre cualquier objeto que implemente la interfaz Runnable. Para ello, una clase necesita implementar un nico mtodo llamado run( ), que se declara de la siguiente forma: public void run( ) El mtodo run( ) Rafael Aguilar Garca - ESCOM - POO21 Definir el cdigo que constituye el nuevo hilo. Puede llamar a otros mtodos, usar otras clases, y declarar variables de la misma forma que el hilo principal main( ). La nica diferencia con main( ) es que el mtodorun( ) establece el punto de entrada para otro hilo de ejecucin concurrente dentro del programa. Este hilo finalizar cuando el mtodo run( ) devuelva el control. El mtodo start( ) Rafael Aguilar Garca - ESCOM - POO22 El nuevo hilo que se acaba de crear no comenzar su ejecucin hasta que se llame al mtodo start( ), declarado dentro de Thread. Esencialmente, start( ) ejecuta una llamada a run( ). La declaracin del mtodo start( ) es la siguiente: void start( ); El ejemplo siguiente crea un segundo hilo: Rafael Aguilar Garca - ESCOM - POO 23 //Creacin de un segundo hilo class NewThread implements Runnable { Thread t; NewThread( ) { //Crea el segundo hilo t = new Thread(this, Hilo demo); System.out.println(Hilo hijo, + t); t.start( ); // Comienzo del hilo } // Este es el punto de entrada para el segundo hilo public void run( ){ try{ for( int i = 5; i > 0 ; i--) { System.out.println(Hilo hijo + i); Thread.sleep(500); } } catch (InterruptedException e) { System.out.println(Interrupcin del hilo hijo.); } System.out.println(Salida del hilo hijo); } } Rafael Aguilar Garca - ESCOM - POO 24 //Continuacin class DemoHilo { public static void main(String args[ ]) { new NewThread( ); // Creacin de un nuevo hilo try{ for(int i = 5; i > 0; i--) { System.out.println(Hilo principal: + i); Thread.sleep(1000); } } catch (InterruptedException e) { System.out.println(Interrupcin del hilo principal); } System.out.println(Salida del hilo principal); } } Salida: Rafael Aguilar Garca - ESCOM - POO25 Hilo hijo: Thread[Hilo demo, 5, main] Hilo principal: 5 Hilo hijo: 5 Hilo hijo: 4 Hilo principal: 4 Hilo hijo: 3 Hilo hijo: 2 Hilo principal: 3 Hilo hijo: 1 Salida del hilo hijo. Hilo principal: 2 Hilo principal: 1 Salida del hilo principal. Usando la clase Thread Rafael Aguilar Garca - ESCOM - POO26 La segunda forma de crear un hilo es mediante la creacin de una nueva clase que extienda a la clase Thread, y crear entonces una instancia de esa clase. La nueva clase debe sobrescribir el mtodo run( ), que es el punto de entrada para el nuevo hilo. Tambin debe llamar al mtodo start( ) para comenzar la ejecucin del nuevo hilo. A continuacin el programa anterior ahora extendiendo la clase Thread: Rafael Aguilar Garca - ESCOM - POO 27 //Creacin de un segundo hilo extendiendo la clase Thread class NewThread extends Thread { NewThread( ) { //Creacin de un nuevo hilo super(Hilo demo); System.out.println(Hilo hijo: + this); start( ); // Comienza el hilo } // Este es el punto de entrada para el segundo hilo public void run( ){ try{ for( int i = 5; i > 0 ; i--) { System.out.println(Hilo hijo + i); Thread.sleep(500); } } catch (InterruptedException e) { System.out.println(Interrupcin del hilo hijo.); } System.out.println(Salida del hilo hijo); } } Rafael Aguilar Garca - ESCOM - POO 28 //Continuacin public class ExtendThread { public static void main(String args[ ]) { new NewThread( ); // Creacin de un nuevo hilo try{ for(int i = 5; i > 0; i--) { System.out.println(Hilo principal: + i); Thread.sleep(1000); } } catch (InterruptedException e) { System.out.println(Interrupcin del hilo principal); } System.out.println(Salida del hilo principal); } } Creacin de mltiples hilos Rafael Aguilar Garca - ESCOM - POO29 Hasta ahora solo se han usado dos hilos: el hilo principal y un hilo hijo. Sin embargo, un programa puede generar tantos hilos como necesite. El siguiente programa crea tres hilos hijo: Rafael Aguilar Garca - ESCOM - POO 30 //Creacin de mltiples hilos class NewThread implements Runnable { String name;//Nombre del hilo Thread t; NewThread(String threadName) { name = threadName; t = new Thread(this, name); System.out.println(Nuevo hilo: + t); t.start( );// Comienza el hilo } // Este es el punto de entrada del hilo public void run( ) { try { for( int i = 5; i > 0; i--) { System.out.println(name + : + i); Thread.sleep(1000); } } catch (InterruptedException e){ System.out.println(Interrupcin del hilo + name); } System.out.println(Salida del hilo + name); }} Rafael Aguilar Garca - ESCOM - POO 31 //Continuacin - Creacin de mltiples hilos class MultiThreadDemo { public static void main(String args[ ]){ new NewThread(Uno); new NewThread(Dos); new NewThread(Tres); try { // Espera a que los otros hilos terminen Thread.sleep(10000); } catch (InterruptedException e ){ System.out.println(Interrupcion del hilo principal); } System.out.println(Salida del hilo principal); } }Rafael Aguilar Garca - ESCOM - POO 32 Nuevo hilo: Thread[Uno,5,main] Nuevo hilo: Thread[Dos,5,main] Nuevo hilo: Thread[Tres,5,main] Uno: 5 Dos: 5 Tres: 5 Uno: 4 Dos: 4 Tres: 4 Uno: 3 Tres: 3 Dos: 3 Uno: 2 Tres: 2 Dos: 2 Uno: 1 Tres: 1 Dos: 1 Salida del hilo Uno. Salida del hilo Dos. Salida del hilo Tres. Salida del hilo principal.. Utilizacin de isAlive y join Rafael Aguilar Garca - ESCOM - POO33 Ahora veamos cmo hacer que el hilo principal (main) termine al final de todos los hilos sin usar el mtodo sleep( ). Para lograr esto necesitamos responder la siguiente pregunta Cmo puede un hilo saber si otro ha terminado? La clase Thread nos da la respuesta.

Utilizacin de isAlive y join Rafael Aguilar Garca - ESCOM - POO34 Existen dos formas de determinar si un hilo ha terminado. La primera consiste en llamar al mtodo isAlive( ) en el hilo. Este es un mtodo definido por Thread y su forma general es la siguiente: final boolean isAlive( ) El mtodo isAlive( ) devuelve el valor true si el hiloal que se hace referencia est todava ejecutndose, y devuelve el valor false en caso contrario. Utilizacin de isAlive y join Rafael Aguilar Garca - ESCOM - POO35 El mtodo isAlive( ) es til en ocasiones; sin embargo, el mtodo que se utiliza habitualmente para esperar a que un hilo termine es el mtodo join( )final void join( ) throws InterruptedException Este mtodo espera hasta que termine el hilo sobre el que se realiz la llamada. Su nombre surge de la idea de que el hilo llamante espere hasta que el hilo especificado se rena con l. Otras formas de join( ) permiten especificar un tiempo mximo de espera para que termine el hilo especificado. Utilizacin de isAlive y join Rafael Aguilar Garca - ESCOM - POO36 A continuacin se presenta una versin mejorada del ejemplo anterior que utiliza el mtodo join( ) para asegurar que el hilo principal es el ltimo en terminar. Tambin sirve de ejemplo del mtodo isAlive( ). Rafael Aguilar Garca - ESCOM - POO 37 //Uso de isAlive y join class NewThread implements Runnable { String name;//Nombre del hilo Thread t; NewThread(String threadName) { name = threadName; t = new Thread(this, name); System.out.println(Nuevo hilo: + t); t.start( );// Comienzo del hilo } // Este es el punto de entrada del hilo public void run( ) { try { for( int i = 5; i > 0; i--) { System.out.println(name + : + i); Thread.sleep(1000); } } catch (InterruptedException e){ System.out.println(Interrupcin del hilo + name); } System.out.println(Salida del hilo + name); }} Rafael Aguilar Garca - ESCOM - POO 38 //Continuacin de isAlive y join class DemoJoin { public static void main(String args[ ]){ NewThread ob1 = new NewThread(Uno); NewThread ob2 = new NewThread(Dos); Newthread ob3 = new newThread(Tres); System.out.println(El hilo Uno est vivo: + ob1.t.isAlive( )); System.out.println(El hilo Dos est vivo: + ob2.t.isAlive( )); System.out.println(El hilo Tres est vivo: + ob3.t.isAlive( )); // Espera a que los otros hilos terminen try { System.out.println(Espera la finalizacin de los otros hilos); ob1.t.join( ); ob2.t.join( ); ob3.t.join( ); } catch (InterruptedException e ){ System.out.println(Interrupcion del hilo principal); } System.out.println(El hilo Uno est vivo: + ob1.t.isAlive( )); System.out.println(El hilo Dos est vivo: + ob2.t.isAlive( )); System.out.println(El hilo Tres est vivo: + ob3.t.isAlive( )); System.out.println(Salida del hilo principal.); } } Rafael Aguilar Garca - ESCOM - POO 39 Nuevo hilo: Thread[Uno,5,main] Nuevo hilo: Thread[Dos,5,main] Nuevo hilo: Thread[Tres,5,main] El hilo Uno esta vivo: true El hilo Dos esta vivo: true El hilo Tres esta vivo: true Espera la finalizacin de los otros hilos Uno: 5 Dos: 5 Tres: 5 Uno: 4 Dos: 4 Tres: 4 Uno: 3 Dos: 3 Tres: 3 Uno: 2 Dos: 2 Tres: 2 Uno: 1 Dos: 1 Tres: 1 Salida del hilo Dos. Salida del hilo Tres. Salida del hilo Uno. El hilo Uno esta vivo: false El hilo Dos esta vivo: false El hilo Tres esta vivo: false Salida del hilo principal.