Thread
-
Upload
juan-campos -
Category
Documents
-
view
216 -
download
1
description
Transcript of Thread
UNIVERSIDAD NACIONAL DE INGENIERIA
Facultad de Ingeniería Industrial y de Sistemas
Escuela Ingeniería de Sistemas
ST232U Lenguaje de Programación Orientado a Objetos
Programación Concurrente
Programación Concurrente1. Introducción2. Proceso3. Hilos (Thread)4. Aplicación Concurrente5. Programación Concurrente6. Beneficios7. JavaThreads8. Creación y Ejecución de Hilos
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
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.
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
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.
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.
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.
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.
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.
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
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.
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)
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.
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 {...}
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()
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.
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
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.
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().
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
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
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.
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().
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.
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.
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);}
} }
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);}
} }
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();
}}
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(),
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