1. Programación Multihilos Topicos selectos Unidad 3 LuisBalam.pdf

25
Programación Concurrente, Multihilo

Transcript of 1. Programación Multihilos Topicos selectos Unidad 3 LuisBalam.pdf

Page 1: 1. Programación Multihilos Topicos selectos Unidad 3 LuisBalam.pdf

Programación Concurrente, Multihilo

Page 2: 1. Programación Multihilos Topicos selectos Unidad 3 LuisBalam.pdf

Programación Multihilo

A diferencia de la mayoría de los lenguajes de programación, Java proporciona soporte para la

programación Multihilo.

Page 3: 1. Programación Multihilos Topicos selectos Unidad 3 LuisBalam.pdf

Programación Multihilo

Un programa multihilo contiene 2 o más partes que pueden ser ejecutadas de manera concurrente o

simultánea. Cada parte del programa se denomina hilo y cada hilo define un camino de ejecución independiente.

Por lo tanto, la programación multihilo es una forma especializada de multitarea.

Page 4: 1. Programación Multihilos Topicos selectos Unidad 3 LuisBalam.pdf

Programación Multihilo

La multitarea lo permiten la mayoría de los sistemas operativos modernos.

Existen 2 tipos distintos de multitarea: la basada en procesos y la basada en hilos.

Un proceso es en esencia un programa que se está ejecutando, por lo que la multitarea basada en proceso es la que permite ejecutar 2 programas

concurrentemente.

Page 5: 1. Programación Multihilos Topicos selectos Unidad 3 LuisBalam.pdf

Programación Multihilo

En la multitarea basada en procesos, un programa es la unidad más pequeña de código que el sistema

puede gestionar. En la multitarea basada en hilos, el hilo es la unidad de código más pequeña que se puede gestionar. Esto

significa que un solo programa puede realizar 2 o más tareas simultáneamente

Page 6: 1. Programación Multihilos Topicos selectos Unidad 3 LuisBalam.pdf

Programación Multihilo

Por tanto, la multitarea basada en procesos actúa sobre “tareas generales”, mientras que la multitarea

basada en hilos gestiona los detalles. Los procesos son tareas mas pesadas, es decir

requieren más recursos. Los hilos por otra parte, son tareas ligeras. La comunicación entre hilos como el intercambio de contextos de un hilo al próximo tiene

un costo bajo.

Page 7: 1. Programación Multihilos Topicos selectos Unidad 3 LuisBalam.pdf

Programación Multihilo

Los programas de Java utilizan entornos multitarea basadas en procesos, pero la multitarea basada en

procesos no está bajo el control de Java. Sin embargo, la multitarea basada en hilos si.

Page 8: 1. Programación Multihilos Topicos selectos Unidad 3 LuisBalam.pdf

Programación Multihilo

La multitarea basada en hilos permite escribir programas muy eficientes que hacen uso óptimo del CPU, ya que el tiempo que éste está libre se reduce

al máximo.

Page 9: 1. Programación Multihilos Topicos selectos Unidad 3 LuisBalam.pdf

Programación Multihilo

En un entorno tradicional de un solo hilo, el programa tiene que esperar a que se realice cada

tarea antes de procesar la siguiente, aunque el cpu esté inactivo la mayor parte del tiempo.

La multitarea basada en hilos permite acceder y aprovechar este tiempo de inactividad del CPU.

Page 10: 1. Programación Multihilos Topicos selectos Unidad 3 LuisBalam.pdf

El modelo de hilos en Java

Los sistemas de un solo hilo utilizan un enfoque denominado ciclo de evento con sondeo. En este modelo, un solo hilo de control se ejecuta en un

ciclo infinito, sondeando una única cola de eventos para decidir cual se procesará a continuación.

Page 11: 1. Programación Multihilos Topicos selectos Unidad 3 LuisBalam.pdf

El modelo de hilos en Java

Hasta que un evento regrese el control, nada más puede ocurrir en el sistema, y esto supone un

desaprovechamiento del CPU. En general, en un entorno de un solo hilo, cuando un hilo bloquea(es decir, suspende la ejecución) porque está esperando

algún recurso, el programa entero se detiene.

Page 12: 1. Programación Multihilos Topicos selectos Unidad 3 LuisBalam.pdf

El modelo de hilos en Java

La ventaja de la programación multihilo en Java es que se elimina el mecanismo principal de ciclo/sondeo. Un hilo puede detenerse sin paralizar el resto de las partes del programa. Por ejemplo, el

tiempo de inactividad que se produce cuando un hilo lee datos de la red o espera a que el usuario

introduzca información, puede ser aprovechado por otro hilo.

Page 13: 1. Programación Multihilos Topicos selectos Unidad 3 LuisBalam.pdf

El modelo de hilos en Java

Cuando en un programa Java, un hilo se bloquea, solo ese hilo se detiene y todos los demás continúan

su ejecución.

Page 14: 1. Programación Multihilos Topicos selectos Unidad 3 LuisBalam.pdf

El modelo de hilos en Java

Los hilos puede encontrarse en distintos estados. Un hilo puede estar ejecutándose o preparado para

ejecutarse tan pronto como se disponga de tiempo de CPU. Un hilo que está ejecutándose puede estar suspendido, lo que significa que temporalmente se suspende su actividad. Un hilo suspendido puede

reanudarse, un hilo puede estar bloqueado cuando se está esperando un determinado recurso y

cualquier instante un hilo puede detenerse, una vez detenido, un hilo no puede reanudarse.

Page 15: 1. Programación Multihilos Topicos selectos Unidad 3 LuisBalam.pdf

Prioridades en hilos

•  Java asigna a cada hilo una prioridad que determina como se debe tratar ese hilo en comparación con los demás.

•  Las prioridades de los hilos son valores enteros que especifican la prioridad relativa de un hilo sobre otro.

•  La prioridad de un hilo se utiliza para decidir cuando se debe pasar de la ejecución de un hilo a la del siguiente. A esto se denomina, cambio de contexto

Page 16: 1. Programación Multihilos Topicos selectos Unidad 3 LuisBalam.pdf

Prioridades en hilos

•  Las reglas que determinan cuando debe tener lugar un cambio de contexto, son muy sencillas:

•  Un hilo puede ceder voluntariamente el control. Se hace por abandono explícito, al quedarse dormido, o bloqueado por una E/S pendiente. Cuando esto ocurre se examinan los demás hilos y se le asigna el CPU al que esté preparado para ejecutarse y tenga la más alta prioridad.

Page 17: 1. Programación Multihilos Topicos selectos Unidad 3 LuisBalam.pdf

Prioridades en hilos

•  Un hilo puede se desalojado por otro con prioridad más alta. En este caso, un hilo con prioridad más baja que no libera el procesador es simplemente desalojado, sin tener en cuenta lo que esté haciendo, por otro de prioridad más alta. A esto se denomina multitarea por desalojo.

Page 18: 1. Programación Multihilos Topicos selectos Unidad 3 LuisBalam.pdf

Intercambio de mensajes

•  Después de dividir el programa en distintos hilos, es necesario definir como se comunicarán entre si. Java proporciona una forma limpia y de bajo costo que permite la comunicación entre 2 o más hilos, por medio de llamadas a métodos predefinidos que tienen todos los objetos. El sistema de mensajes de java permite que un hilo entre en un método sincronizado de un objeto y espere ahí hasta que otro hilo le notifique explícitamente que debe salir.

Page 19: 1. Programación Multihilos Topicos selectos Unidad 3 LuisBalam.pdf

La clase Thread y la interfaz Runnable

•  El sistema multihilo de Java está construido en torno a la clase Thread, sus métodos y su correspondiente interfaz, Runnable. La clase Thread encapsula a un hilo de ejecución. Para crear un nuevo hilo, el programa deberá extender la clase Thread o bien implementar la interfaz Runnable.

•  Hasta el momento todos los ejemplos que hemos visto han utilizado un solo hilo de ejecución, el hilo principal.

Page 20: 1. Programación Multihilos Topicos selectos Unidad 3 LuisBalam.pdf

El hilo principal

•  Cuando un programa Java comienza su ejecución, hay un hilo ejecutándose inmediatamente, a este hilo se le denomina hilo principal del programa, este es importante por 2 razones:

•  1. Es el hilo a partir del cual se crean el resto de los hilos del programa.

•  2. Normalmente, debe ser el último que finaliza su ejecución, ya que es el responsable de realizar diversas acciones de cierre.

Page 21: 1. Programación Multihilos Topicos selectos Unidad 3 LuisBalam.pdf

El hilo principal

•  Aunque el hilo principal se crea automáticamente cuando el programa comienza, se puede controlar a través de un objeto Thread. Para ello, se debe obtener una referencia al mismo llamando al método currentThread(), que es un miembro public static de la clase Thread.

•  Comencemos con el primer ejemplo.

Page 22: 1. Programación Multihilos Topicos selectos Unidad 3 LuisBalam.pdf

•  class DemoHiloActual {

•  public static void main (String args[ ]) {

•  Thread t= Thread.currentThread();

•  System.out.println (“Hilo actual: “ + t);

•  t.setName (“Mi Hilo”);

•  System.out.println (“Después 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 (“interrupción del hilo principal”);

•  }

•  }

•  }

Salida generada: Hilo actual: Thread[main,5,main] Después del cambio de nombre: Thread[Mi Hilo,5,main] 5 4 3 2 1

Page 23: 1. Programación Multihilos Topicos selectos Unidad 3 LuisBalam.pdf

Creación de un Hilo •  En sentido amplio se puede crear un hilo

creando un objeto del tipo Thread. Java define 2 formas en las que se puede hacer esto:

•  1. Implementando la interfaz Runnable •  2. Extendiendo la propia clase Thread.

•  Veamos cada uno de ellos.

Page 24: 1. Programación Multihilos Topicos selectos Unidad 3 LuisBalam.pdf

Creación de un Hilo, implementado la interfaz Runnable //creación de un segundo hilo

Class NewThread implements Runnable {

Thread t:

NewThread ( ) {

t=new Thread (this, “Hilo demo”);

System.out.println (“Hilo hijo: “+t);

t.start(); //comienza la ejecución

}

public void run( ) { //código del hilo

try {

for (int i = 5; i>0;i - -) {

System.out.println (“Hilo hijo: “+i);

Thread.sleep(500);

}

} catch (InterruptedException e) {

System.out.println(“Interrupcion del hilo hijo. “);

} // fin del metodo run

System.out.println (“Salida del hilo hijo”);

}

}

Class DemoHilo { public static void main (String args[ ]) { new NewThread( ); creacion del nvo hilo try { for (int i=5;i>0:i - -) { System.out.println(“Hilo principal: “+i); Thread.sleep(1000); } } catch (InterruptedException e) { System.out.println(“Interrupcion del hilo principal”); } System.out.println (“Salida del hilo principal”); } }

El método run() es el punto de entrada para otro hilo de ejecución concurrente dentro del programa, este hilo finaliza cuando el método run() devuelva el control. El argumento this indica que el nuevo hilo llame al método run()

Nota: La salida del programa depende de la velocidad del procesador y la carga de tareas.

Page 25: 1. Programación Multihilos Topicos selectos Unidad 3 LuisBalam.pdf

class TestTh extends Thread { private String nombre; private int retardo; public TestTh( String s,int d ) { nombre = s; retardo = d; } public void run() { try { sleep( retardo ); } catch( InterruptedException e ) { ; } System.out.println( "Hola Mundo! "+nombre+" "+retardo ); } }

public class MultiHola { public static void main( String args[] ) { TestTh t1,t2,t3; 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) ); t1.start(); t2.start(); t3.start(); } }

Salida del programa: Hola Mundo! Thread 2 202 Hola Mundo! Thread 3 1306 Hola Mundo! Thread 1 1608 Process completed.

Creación de un Hilo, extendiendo la clase Thread