Thread

32
UNIVERSIDAD NACIONAL DE INGENIERIA Facultad de Ingeniería Industrial y de Sistemas

description

programación de hilos

Transcript of Thread

Page 1: Thread

UNIVERSIDAD NACIONAL DE INGENIERIA

Facultad de Ingeniería Industrial y de Sistemas

Page 2: Thread

Escuela Ingeniería de Sistemas

ST232U Lenguaje de Programación Orientado a Objetos

Programación Concurrente

Page 3: Thread

Programación Concurrente1. Introducción2. Proceso3. Hilos (Thread)4. Aplicación Concurrente5. Programación Concurrente6. Beneficios7. JavaThreads8. Creación y Ejecución de Hilos

Page 4: Thread

1. Introducción1. Por la evolución de hardware(hw) y

software(sw), en la actualidad cualquier usuario:- Espera poder hacer varias tareas a la vez- No verse forzado a ejecutar programas secuenciales

2. La evolución de hw y sw ha hecho posible sistemas operativos multitarea como Unix o Windows. - Procesan varios programas (hilos)a la vez o sea

concurrentemente, aun los que disponen de un solo procesador

Page 5: Thread

1. Introducción1. Concurrencia. Se dice de dos tareas que

ocurren o se procesan en el mismo intervalo de tiempo.- Posee un conjunto de técnica y notaciones para

expresar la programación paralela.- Resuelve problemas de comunicación y

sincronización.

2. En entornos distribuidos o el uso de computadoras con varios procesadores se habla de programación distribuida o programación paralalela, respectivamente.

Page 6: Thread

1. Introducción1. Concurrencia. Con Java se puede lanzar múltiples

hilos desde un programa concurrente– Estos hilos puede ser ejecutados simultáneamente en un

microprocesador– Con la programación multihilos puede hacer un programa

mas sensible e interactivo así como mejorar su desempeño.– En ocasiones un programa multihilos corren mas

rápidamente que un programa de un solo hilo.– Cuando el programa se ejecuta como aplicación, java

comienza un hilo en método main– En Java, cada tarea es una instancia de la interface

Runnable , esencialmente un hilo es un objeto que facilita la ejecución de una tarea

Page 7: Thread

2. Proceso1. Proceso . Es un programa en ejecución con un

estado asociado:- Procesos Independientes: Son los distintos

procesos que se pueden ejecutar en un SO multitarea.

- Cada Proceso ocupa un espacio de memoria independiente.

- Una aplicación puede implementarse como un conjunto de procesos que colaboren entre si para lograr los objetivos, para lo cual se emplean distinto mecanismos de comunicación entre procesos.

Page 8: Thread

2. Proceso1. Proceso . Es un ejemplar en ejecución de un

programa, Un proceso posee: [Ceballos 2000]- Su propio espacio de direcciones- Su “propia” memoria- Sus variables- Archivos abiertos- Contador de programa, registros, pilas señales,

semáforos, etc.Es equivalente a decir que cada proceso su propio procesador “virtual” lo que nos permite comprender como un sistema puede ejecutar varios procesos a la vez.

Page 9: Thread

3. Hilos o Thread1. Hilos o Thread . En un proceso donde pueden

existir varios Hilos de control independientes. Los SO actuales permiten un nivel adicional de paralelismo dentro de un proceso:- Cada Hilo es una vía simultanea de ejecución

dentro del espacio de memoria del proceso.- La comunicación entre distintos Hilos se pueden

realizar a través del espacio de memoria que comparten:

- utilizando mecanismos de sincronización para controlar el acceso a este recurso compartido por todos los hilos de un proceso.

Page 10: Thread

4. Aplicación Concurrente1. Aplicación Concurrente . En una aplicación

que se descompone en un conjunto de procesos y/o hilos.

2. Aplicación Multihilo. Esta constituido por distintos hilos que comparten el espacio de memoria de un proceso.

Page 11: Thread

5. Programación Concurrente1. Independientemente si utilizamos procesos o

hilos, el desarrollo de aplicaciones concurrentes involucra:- El uso de técnicas especificas y - La superación de dificultades que no se

presentan en la programación secuencial.

Page 12: Thread

5. Programación Concurrente• Un programa concurrente es un programa diseñado para

tener varios contextos de ejecución o hebras.• Un programa paralelo es un programa que hay varias hebras

activas a la vez.• En sistemas operativos multiproceso, el mismo programa lo

pueden ejecutar varios procesos

Un programa, dos subprocesos

Page 13: Thread

5. Programación Concurrente- La Implementación es mas compleja que las

aplicaciones secuenciales:- Debemos garantizar la coordinación de los distintos

hilos o procesos.- La depuración es extremadamente difícil:

- La ejecución de los distintos hilos o procesos se entrelazan conforme el SO les va asignando tiempo de procesador es algo que no podemos prever.

- El rendimiento puede medirse en función al tiempo de respuesta del sistema o de la cantidad de trabajo que realiza por unidad de tiempo: throughput.

Page 14: Thread

6. BeneficiosA pesar de los inconvenientes detallados, conviene:1. Usuario. Los hilos y procesos permiten la creación de

interfaces que respondan mejor a las ordenes del usuario- Por lo general una aplicación ha de atender las peticiones de distintos

usuarios, el uso de hilos o procesos permite que varios usuarios acceden simultáneamente

2. Recursos del Sistema. Cualquier operación que pueda bloquear la aplicación durante un periodo de tiempo apreciable es recomendable que se realice en forma independiente– El procesador es el dispositivo rápido del computador– Algunas versiones de PIV de intel incorporan Hyper-Threading: un

único procesador puede funcionar como multiprocesador (SMT: Simultaneos MultiThreading)

Page 15: Thread

6. BeneficiosA pesar de los inconvenientes detallados, conviene:1. Paralelismo Real. Por eficiencia, requiere el uso de

Hilos y procesos:- Un sistema multiprocesador dispone de varios procesadores.- Un cluster de computadoras esta formado por conjunto de

computadoras conectados entre si a los que accede como si se tratase de un único computador

2. Popularización: Paralelismo implícito. A veces los hilos o procesos no tiene una justificación física, sino que un programa se puede diseñar mas fácilmente si los descomponemos en un conjunto de tareas independientes.

Page 16: Thread

7. JAVA Threads• Thread (hilo, tarea) es la clase base de Java para

definir hilos de ejecución concurrentes dentro de un mismo programa.

• En Java, como lenguaje OO, el concepto de concurrencia está asociado a los objetos:– Son los objetos los que actúan concurrentemente con

otros.• Las clases de objetos (hilos) que puedan actuar

concurrentemente deben extender la clase Thread.– Ejemplo:Class ClaseConcurrente extends Thread {...}

Page 17: Thread

7. Clase Threads• Las clases derivadas de Thread deben de incluir un

método:public void run ()

– Este método especifica realmente la tarea a realizar.

• La ejecución del método run de un Thread puede realizarse concurrentemente con otros métodos run de otros Thread y con el método main.

Objeto A

run()

Objeto B

run()

Objeto C

run()main()

Page 18: Thread

7. Iniciar una Tarea: start• El inicio de la ejecución de una tarea se realiza

mediante el método start() heredado de Thread.

• start() es un método especial que invoca a run() y devuelve inmediatamente el control a la tarea que lo ha llamado.

Page 19: Thread

7. Clase Thread [A.Froufe]• Encapsula todo el control sobre hilos. Esta clase

controla el comportamiento de los hilos:– Objeto. Es el panel de control de un hilo en ejecución

• Métodos de clase• Métodos de instancia

Page 20: Thread

7. Clase Thread [A.Froufe]• Métodos de clase

– currentThread(). Devuelve el objeto thread que representa al hilo de ejecución que se está ejecutando actualmente.

– yield(). Cambie el contexto entre el hilo actual y el siguiente hilo ejecutable disponible. Es una manera de asegurar que los hilos de menor prioridad no sufran inanición.

– sleep( long ). Pone al hilo en curso a dormir durante el número de milisegundos que se indiquen en el parámetro de invocación. Una vez transcurridos esos milisegundos, dicho hilo volverá a estar disponible para su ejecución. Precisiones a lo mas 10 milisegundos.

Page 21: Thread

7. Clase Thread [A.Froufe]• Métodos de Instancia. Se detalla algunos:

– start(). Comienza la ejecucion del hilo. No debe llamarse mas de una vez para el mismo hilo.– run(). Es llamdo por el metodo star(). Se detiene cuando devuelve el hilo– stop( ). Una manera brusca de detener el hilo. No debe utilizarse este metodo,

debe utilizarse una variable en el metodo run() que ocasione la terminación– suspend(). Una forma distinta de stop(), suspende la ejecucion del hilo en curso, se

vueve activar con resume().– resume(). Revive un hilo suspendido. No necesariamente se va ejecutar

inmediatamente, puede haber hilos de mayor prioridad funcionando.– setPriority(). Asigna una prioridad indicada por el valor pasado como parametro

como MIN_PRIORITY, NORM_PRIORITY y MAX_PRIORITY, que toman los valores 1, 5 y 10, respectivamente. Tener cuidado con MAX_PRIORITY si no se hace llamadas a sleep() o yield(), java puede quedar fuera de control.

– getPriority(). Devuelve la prioridad del hilo de ejecución en curso, que es un valor comprendido entre uno y diez.

– setName(). Permite identificar al hilo con un nombre nemónico. De esta manera se facilita la depuración de programas multihilo

– getName(). Devuelve el valor actual, de tipo cadena, asignado como nombre al hilo en ejecución mediante setName().

Page 22: Thread

22

Ejemplo: Hilo

class Hilo extends Thread {public Hilo (String cad) {

super(cad); } public void run() { int i; for (i=0;i<10;i++) { System.out.println(i+" "+getName()); try { sleep((long)(Math.random()*1000)); }

catch (InterruptedException e) {

}}

System.out.println("FIN...! " + getName()); }}

La clase cuyos objetos pueden ser

concurrentes

Tarea será concurrente

Detiene la ejecución del Hilo (“duerme”) un tiempo aleatorio entre 0 y 1 segundo

Page 23: Thread

23

Ejemplo: THilo

public class THilo {

public static void main (String[] args) {Hilo uno, dos;

uno = new Hilo("Uno");dos = new Hilo("Dos");

uno.start();dos.start();

System.out.println("main no hace nada"); }}

Crea objetos con un nombre

Arranca dos hilos

Page 24: Thread

24

Ejemplo: THilo

public class THilo {

public static void main (String[] args) {Hilo uno, dos;

uno = new Hilo("Uno");dos = new Hilo("Dos");

uno.start();dos.start();

System.out.println("main no hace nada"); }}

main no hace nada0 Dos0 Uno1 Dos1 Uno2 Dos3 Dos4 Dos2 Uno5 Dos3 Uno6 Dos7 Dos4 Uno5 Uno8 Dos6 Uno9 Dos7 UnoFIN...! Dos8 Uno9 UnoFIN...! Uno

Process completed.

Page 25: Thread

8. Creación y Ejecución de Hilos1. Creación. La forma mas sencilla de crear un Hilo en

Java es diseñar una subclase de java.lang Thread. :- En la subclase redefiniremos el metodo run(), que viene a ser algo

asicomo un main() para un hilo.

2. Ejecución. Para empezar la ejecución paralela de un nuevo Hilo usaremos el método start().

Page 26: Thread

8. Creación y Ejecución de Hilos1. Hilos

– En java se pueden lanzar múltiples hilos y pueden ejecutados simultáneamente, mejorando su desempeño

– En ocasiones, un programa multihilos pueden ejecutarse mas rápido que uno de un solo hilo.

– En Java, cada tarea es una instancia de la interface Runnable (objeto runnable)

– Un hilo (thread) es un objeto que facilita la ejecucion de una tarea. Las tareas son objetos y se debe crear una clase para las tareas

– Para crear tareas debe crear una clase que implemente la interface Runnable.

– La interface Runnable tiene un único métdo llamado run(), el cual debe implementar la clase pra decirle como se va a ejecutar el hilo.

Page 27: Thread

8. Creación y Ejecución de Hilos1. Hilos

– En java, la clase Thread tiene varios métodos para controlar los hilos y el constructor para crear hilos, Para crear el hilo de un proceso:

Thread hilo=new Thread (proceso);– Luego invoque el método start(), con esto el JVM esta para

ejecutarse:hilo.start();

– El JVM ejecutara el proceso invocando al metodo run() de dicho proceso.

Page 28: Thread

8. Creación y Ejecución de Hilospublic class Caracter implements Runnable{

private char car;private int ccar;

public Caracter(char vcar, int vccar) { car=vcar; ccar=vccar; } //Implementando metodo de Runnable

public void run(){ //metodo de interface Runnableint i;for(i=0;i<ccar;i=i+1){

System.out.print(car);}

} }

Page 29: Thread

8. Creación y Ejecución de Hilospublic class Numero implements Runnable{

private int n;//numero de elementos a imprimir

public Numero(int vn) { n=vn; }

public void run(){int i;//Despues de escribir n elementos cede el y a otros hilosfor(i=0;i<n;i=i+1){ System.out.print(" "+i);}

} }

Page 30: Thread

8. Creación y Ejecución de Hilospublic class THilo {

public static void main(String ar[]){//Crear procesosRunnable varA=new Caracter('a', 50);Runnable varB=new Caracter('b', 50);Runnable var50=new Numero(50);//Crear hilosThread h1= new Thread(varA);Thread h2= new Thread(varB);Thread h3= new Thread(var50);//Arranca hilosh1.start();System.out.println();h2.start();System.out.println();h3.start();System.out.println();

}}

Page 31: Thread

8. Creación y Ejecución de Hilos1. Hilos

– El metodo yield() de la clase Thread se utiliza cada vez que desea liberar temporamente tiempo a otros hilos

Thread.yield();– El metodo sleep(), pone a “dormir” al hilo el tiempo especificado y

permite a otros hilos ejecutarse:Thread.sleep(10);

– El metodo sleep(long miliSeg) puede lanzar excepcion de tipo InterruptedException.

– Analice los metodos: join(), setPriority(), getPriority(),

Page 32: Thread

BibliografíaDeitel J. Paul y Deitel M. Harvey. Java. Como Programar

Prentice Hall. 2008. México D. F. 2008.

Cevallos Sierra, Francisco Javier. Java 2 Curso de Programación. Alfaomega Grupo Editor S. A. México D. F. 2000