48
Hilos y Multihilos Un thread (hilo, flujo de control del programa) representa un proceso individual ejecutándose en un sistema. A veces se les llama procesos ligeros o contextos de ejecución. Cada hilo controla un único aspecto dentro de un programa, como puede ser supervisar la entrada en un determinado periférico o controlar toda la entrada/salida del disco. Todos los hilos comparten los mismos recursos, al contrario que los procesos, en donde cada uno tiene su propia copia de código y datos (separados unos de otros).

Hilos y Multihilos Un thread (hilo, flujo de control del programa) representa un proceso individual ejecutándose en un sistema. A veces se les llama procesos

Embed Size (px)

Citation preview

Page 1: Hilos y Multihilos Un thread (hilo, flujo de control del programa) representa un proceso individual ejecutándose en un sistema. A veces se les llama procesos

Hilos y Multihilos

• Un thread (hilo, flujo de control del programa) representa un proceso individual ejecutándose en un sistema.

• A veces se les llama procesos ligeros o contextos de ejecución.

• Cada hilo controla un único aspecto dentro de un programa, como puede ser supervisar la entrada en un determinado periférico o controlar toda la entrada/salida del disco.

• Todos los hilos comparten los mismos recursos, al contrario que los procesos, en donde cada uno tiene su propia copia de código y datos (separados unos de otros).

Page 2: Hilos y Multihilos Un thread (hilo, flujo de control del programa) representa un proceso individual ejecutándose en un sistema. A veces se les llama procesos

Hilos

• Hay que distinguir multihilo (multithread) de multiproceso.

• El multiproceso se refiere a dos programas que se ejecutan "aparentemente" a la vez, bajo el control del Sistema Operativo.

• Multihilo se refiere a que dos o más tareas se ejecutan "aparentemente" a la vez, dentro de un mismo programa.

Page 3: Hilos y Multihilos Un thread (hilo, flujo de control del programa) representa un proceso individual ejecutándose en un sistema. A veces se les llama procesos

Programas de un único Hilo

• Un programa de flujo único o mono-hilvanado (single-thread) utiliza un único flujo de control (thread) para controlar su ejecución..

• Por ejemplo, en la aplicación estándar de HolaMundo:

public class HolaMundo { static public void main( String args[] ) { System.out.println( "Hola Mundo!" ); } }

Page 4: Hilos y Multihilos Un thread (hilo, flujo de control del programa) representa un proceso individual ejecutándose en un sistema. A veces se les llama procesos

Programas de múltiples Hilos

• La simplicidad para crear, configurar y ejecutar hilos de ejecución, permite que se puedan implementar muy poderosas y portables aplicaciones/applets que no se puede con otros lenguajes de tercera generación.

Page 5: Hilos y Multihilos Un thread (hilo, flujo de control del programa) representa un proceso individual ejecutándose en un sistema. A veces se les llama procesos

La clase Thread

• Es la clase que encapsula todo el control necesario sobre los hilos de ejecución (threads).

• La clase Thread es la única forma de controlar el comportamiento de los hilos, esto se logra con los métodos que proporciona.

Page 6: Hilos y Multihilos Un thread (hilo, flujo de control del programa) representa un proceso individual ejecutándose en un sistema. A veces se les llama procesos

La clase Thread

Page 7: Hilos y Multihilos Un thread (hilo, flujo de control del programa) representa un proceso individual ejecutándose en un sistema. A veces se les llama procesos

Métodos de la clase Thread

• Métodos de Clase

– currentThread()

– yield()

– sleep( long )

Page 8: Hilos y Multihilos Un thread (hilo, flujo de control del programa) representa un proceso individual ejecutándose en un sistema. A veces se les llama procesos

Métodos de la clase Thread

• Métodos de Instancia

– start()

– run()

– stop()

– suspend()

– resume()

– setPriority( int )

– getPriority()

– setName( String )

– getName()

Page 9: Hilos y Multihilos Un thread (hilo, flujo de control del programa) representa un proceso individual ejecutándose en un sistema. A veces se les llama procesos

Creación de un Thread

• Modos de conseguir hilos de ejecución (threads) en Java.

– Extender la clase Thread.

– Implementando la interfaz Runnable,

Page 10: Hilos y Multihilos Un thread (hilo, flujo de control del programa) representa un proceso individual ejecutándose en un sistema. A veces se les llama procesos

Creación de un Thread(ii)

• El primer método de crear un hilo de ejecución es simplemente extender la clase Thread:

class MiThread extends Thread { public void run() { . . . }

Page 11: Hilos y Multihilos Un thread (hilo, flujo de control del programa) representa un proceso individual ejecutándose en un sistema. A veces se les llama procesos

La interfaz Runneable

• Solamente contiene métodos abstractos, con lo cual es una clase para dar idea sobre el diseño de la clase Thread.

package java.lang;public interface Runnable { public abstract void run() ; }

Page 12: Hilos y Multihilos Un thread (hilo, flujo de control del programa) representa un proceso individual ejecutándose en un sistema. A veces se les llama procesos

Arranque de un ThreadEjemplo 1. Muestra la creación de hilos de ejecución extendiendo directamente la clase Thread.EjemploExtendClaseHilo.java

Ejemplo 3. .Muestra la instanciación y ejecución de hilos de ejecución utilizando el interfaz Runnable en vez de extender la clase Thread. Java1001.java

Ejemplo 2. Muestra la creación de hilos de ejecución extendiendo directamente la clase Thread.Ejemplo2ExtendHilo.java

Page 13: Hilos y Multihilos Un thread (hilo, flujo de control del programa) representa un proceso individual ejecutándose en un sistema. A veces se les llama procesos

Manipulación de un Thread

• Todo lo que se quiera que haga el hilo de ejecución ha de estar dentro de run().

• Cuando un método es Runnable, es obligatorio escribir un método run().

Page 14: Hilos y Multihilos Un thread (hilo, flujo de control del programa) representa un proceso individual ejecutándose en un sistema. A veces se les llama procesos

Manipulación de un Thread(ii)

• sleep( retardo );

• El método sleep() simplemente le dice al hilo de ejecución que duerma durante los milisegundos especificados.

Page 15: Hilos y Multihilos Un thread (hilo, flujo de control del programa) representa un proceso individual ejecutándose en un sistema. A veces se les llama procesos

Suspensión de un Thread

• El método suspend().

t1.suspend();

• El hilo es suspendido indefinidamente y para volver a activarlo de nuevo se necesita realizar una invocación al método resume():

t1.resume();

Page 16: Hilos y Multihilos Un thread (hilo, flujo de control del programa) representa un proceso individual ejecutándose en un sistema. A veces se les llama procesos

Suspensión de un Thread(ii)

• wait(); y notify();

• Son parte de la clase Object.

• Wait y notify solo funcionan dentro de metodos o bloques synchronized.

Page 17: Hilos y Multihilos Un thread (hilo, flujo de control del programa) representa un proceso individual ejecutándose en un sistema. A veces se les llama procesos

Parar un Thread

• El método stop(). Se utiliza para terminar la ejecución de un hilo:

t1.stop();

• Esta llamada no destruye el hilo, sino que detiene su ejecución.

• La ejecución no se puede reanudar ya con t1.start().

• Quedará marcado para eliminación (garbage collector).

Page 18: Hilos y Multihilos Un thread (hilo, flujo de control del programa) representa un proceso individual ejecutándose en un sistema. A veces se les llama procesos

Comprobación de vida de un hilo

• Si se necesita, se puede comprobar si un hilo está vivo o no; considerando vivo un hilo que ha comenzado y no ha sido detenido.

t1.isAlive();

Page 19: Hilos y Multihilos Un thread (hilo, flujo de control del programa) representa un proceso individual ejecutándose en un sistema. A veces se les llama procesos

Estados de un thread

• Durante el ciclo de vida de un thread, éste se puede encontrar en diferentes estados.

Page 20: Hilos y Multihilos Un thread (hilo, flujo de control del programa) representa un proceso individual ejecutándose en un sistema. A veces se les llama procesos

Estados de un thread(ii)

• Nuevo Thread

Thread MiThread = new MiClaseThread();

• Cuando un thread está en este estado, es simplemente un objeto Thread vacío.

• Desde este estado solamente puede arrancarse llamando al método start(), o detenerse definitivamente, llamando al método stop().

Page 21: Hilos y Multihilos Un thread (hilo, flujo de control del programa) representa un proceso individual ejecutándose en un sistema. A veces se les llama procesos

Estados de un thread(iii)

• Ejecutable

Thread MiThread = new MiClaseThread();

MiThread.start();

• La llamada al método start() creará los recursos del sistema necesarios para que el thread puede ejecutarse, lo incorpora a la lista de procesos disponibles para ejecución del sistema

• Llama al método run() del thread.

Page 22: Hilos y Multihilos Un thread (hilo, flujo de control del programa) representa un proceso individual ejecutándose en un sistema. A veces se les llama procesos

Estados de un thread(iv)

• Parado

• El thread entra en estado "Parado" cuando alguien llama al método suspend(), cuando se llama al método sleep(), cuando el thread está bloqueado en un proceso de entrada/salida o cuando el thread utiliza su método wait() para esperar a que se cumpla una determinada condición.

Page 23: Hilos y Multihilos Un thread (hilo, flujo de control del programa) representa un proceso individual ejecutándose en un sistema. A veces se les llama procesos

Estados de un thread(v)

• Parado

• Los métodos de recuperación del estado Ejecutable son los siguientes:

• Si un thread está dormido, pasado el lapso de tiempo.

• Si un thread está suspendido, luego de una llamada al método resume().

• Si un thread está bloqueado en una entrada/salida, una vez que el comando E/S concluya su ejecución.

Page 24: Hilos y Multihilos Un thread (hilo, flujo de control del programa) representa un proceso individual ejecutándose en un sistema. A veces se les llama procesos

Estados de un thread(vi)

• Muerto

• Un thread se puede morir de dos formas: por causas naturales o porque lo maten (con stop()).

• El método stop() envía un objeto ThreadDeath al thread que quiere detener.

Page 25: Hilos y Multihilos Un thread (hilo, flujo de control del programa) representa un proceso individual ejecutándose en un sistema. A veces se les llama procesos

Estados de un thread(vii)

Ejemplo 4. El siguiente ejemplo muestra los cambios

de estados de un thread utilizando los métodos de la

clase Thread que se han revisado llegados a este

punto.

Page 26: Hilos y Multihilos Un thread (hilo, flujo de control del programa) representa un proceso individual ejecutándose en un sistema. A veces se les llama procesos

Sheduling

• Java tiene un Scheduler, una lista de procesos, que monitoriza todos los hilos que se están ejecutando en todos los programas y decide cuales deben ejecutarse y cuales deben encontrarse preparados para su ejecución.

Page 27: Hilos y Multihilos Un thread (hilo, flujo de control del programa) representa un proceso individual ejecutándose en un sistema. A veces se les llama procesos

Prioridades• La prioridad de un hilo indica lo importante que es cada

hilo. Si hay varios hilos bloqueados o en espera de ejecutarse , el planificador ejecutará el de mayor prioridad en primer lugar.

• El rango de prioridades oscila entre 1 y 10.

• THREAD.NORM_PRIORITY ( 5 ).

• THREAD. MIN_PRIORITY ( 1 ).

• THREAD. MAX_PRIORITY ( 10 ).

• Se puede leer la prioridad de un hilo con getPriority() o/y cambiarla con setPriority().

Ver Prioridad.java

Page 28: Hilos y Multihilos Un thread (hilo, flujo de control del programa) representa un proceso individual ejecutándose en un sistema. A veces se les llama procesos

Sincronización de Hilos

• Java utiliza monitores para manejar la sincronización.

• Todo objeto con métodos synchronized ( sincronizado) es un monitor.

• El monitor sólo permite a un hilo a la vez ejecutar un método synchronized con el objeto. Esto se logra poniendo un candado al objeto cuando se invoca el método; todos los demás hilos que intenten invocar el método deberán esperar.

• Cuando el método synchronized termina de ejecutarse, se libera el candado del objeto y el monitor permite que el hilo listo con más alta prioridad que este intentando invocar el método proceda.

Page 29: Hilos y Multihilos Un thread (hilo, flujo de control del programa) representa un proceso individual ejecutándose en un sistema. A veces se les llama procesos

Sincronización de Hilos • El método wait hace que el hilo deje de competir por el

procesador y por el objeto monitor, el hilo esperará en una cola.

• El método notify actúa como una señal para el hilo en espera, indicándole que la condición que estaba esperando ya sesatizfacio, y que es aceptable que vuelva entraren el monitor.

• El método notifyAll, todos los hilos que estaban esperando el objeto se hacen elegibles para volver a entrar al monitor; y solo uno de ellos entrar a la vez.

Page 30: Hilos y Multihilos Un thread (hilo, flujo de control del programa) representa un proceso individual ejecutándose en un sistema. A veces se les llama procesos

Sincronización de Hilos

• El ejemplo clásico de sincronización hilos es un modelo productor/consumidor

Ver. HiloConSincronización.java

Page 31: Hilos y Multihilos Un thread (hilo, flujo de control del programa) representa un proceso individual ejecutándose en un sistema. A veces se les llama procesos

Hilos Demonio• También se llaman servicios.

• Se ejecutan, con prioridad baja y proporcionan un servicio básico a un programa o programas cuando la actividad de la computadora es reducida.

• Un ejemplo de hilo demonio que está ejecutándose continuamente es el recolector de basura (garbage collector).

• Cuando sólo quedan hilos daemon en un programa, el programa termina.

Page 32: Hilos y Multihilos Un thread (hilo, flujo de control del programa) representa un proceso individual ejecutándose en un sistema. A veces se les llama procesos

Métodos

• Se Designa un hilo como daemon utilizando el método SetDaemon ( true );

• El método isDaemon devuelve true si un hilo es daemon, y false si no lo es.

Ver. Daemons.java

Hilos Demonios

Page 33: Hilos y Multihilos Un thread (hilo, flujo de control del programa) representa un proceso individual ejecutándose en un sistema. A veces se les llama procesos

Grupos de Hilos

• En ocasiones resulta útil identificar varios hilos como pertenecientes a un grupo de hilos.

• La clase ThreadGroup contiene los métodos necesarios para crear y manipular grupos de hilos.

• Cuando se invoca el constructor, se asigna un nombre único al grupo mediante un argumento String.

• Los hilos de un grupo pueden tratarse colectivamente; se puede suspender, reanudar, etc. Todos los hilos de un grupo.

Page 34: Hilos y Multihilos Un thread (hilo, flujo de control del programa) representa un proceso individual ejecutándose en un sistema. A veces se les llama procesos
Page 35: Hilos y Multihilos Un thread (hilo, flujo de control del programa) representa un proceso individual ejecutándose en un sistema. A veces se les llama procesos

Grupos de Hilos

• Si no se especifica un grupo en el constructor, el sistema coloca el hilo en el mismo grupo en que se encuentre el hilo de ejecución que lo haya creado, y si no se especifica en grupo para ninguno de los hilos, entonces todos serán miembros del grupo "main", que es creado por el sistema cuando arranca la aplicación Java.

Ver. GrupoHilo1.java

Page 36: Hilos y Multihilos Un thread (hilo, flujo de control del programa) representa un proceso individual ejecutándose en un sistema. A veces se les llama procesos

Implementación de Tuberías en Java

Page 37: Hilos y Multihilos Un thread (hilo, flujo de control del programa) representa un proceso individual ejecutándose en un sistema. A veces se les llama procesos

Tuberías

Las tuberías se utilizan para canalizar la salida de un programa (o hilo) a la entrada de otro programa (o hilo) es decir nos sirve como mecanismo de comunicación entre dos procesos.

En java tenemos cuatro clases para utilizar tuberías.

Las cuales son:

•PipedInputStream•PipedOutputStream •PipedReader •PipedWriter

Page 38: Hilos y Multihilos Un thread (hilo, flujo de control del programa) representa un proceso individual ejecutándose en un sistema. A veces se les llama procesos

La clase PipedInputStream

Page 39: Hilos y Multihilos Un thread (hilo, flujo de control del programa) representa un proceso individual ejecutándose en un sistema. A veces se les llama procesos

La clase PipedInputStream(ii)

Page 40: Hilos y Multihilos Un thread (hilo, flujo de control del programa) representa un proceso individual ejecutándose en un sistema. A veces se les llama procesos

Clase PipedInputStream(iii)Campos

protected  byte[] Buffer : Es un buffer circular en donde se colocan los datos

protected in: es el índice del buffer circular que indica donde serán

almacenados los datos.

protected out : el indice de que indica de donde se leerá

protected static final int PIPE_SIZE : es el tamaño del buffer circular

Constructores:

public PipedInputStream() : crea una PipedInputStream que aun no esta conectada

public PipedInputStream(PipedOutputStream src) throws IOException : crea una

pipa de entrada que esta conectada a una pipa de salida

Page 41: Hilos y Multihilos Un thread (hilo, flujo de control del programa) representa un proceso individual ejecutándose en un sistema. A veces se les llama procesos

Clase PipedInputStream(iv)Métodos

public int available() throws IOException : devuelve el numero de

bytes que pueden ser leidos de este flujo de entrada sin bloquear.

public void close() throws IOException : cierra la pipa y libera los

recursos del sistema que tenia asociado.

public void connect(PipedOutputStream src) throws IOException

public int read() throws IOException

public int read(byte[] b, int off, int len) throws IOException

protected void receive(int b) throws IOException

Page 42: Hilos y Multihilos Un thread (hilo, flujo de control del programa) representa un proceso individual ejecutándose en un sistema. A veces se les llama procesos

Constructores

public PipedOutputStream()public PipedOutputStream(PipedInputStream snk) throws IOException

Métodos

public void close() throws IOExceptionpublic void connect(PipedInputStream snk) throws IOExceptionpublic void flush() throws IOExceptionpublic void write(byte[] b, int off, int len) throws IOExceptionpublic void write(int b)

Clase PipedOutputStream

Page 43: Hilos y Multihilos Un thread (hilo, flujo de control del programa) representa un proceso individual ejecutándose en un sistema. A veces se les llama procesos

                                                                                                                

Clase PipedReader

Constructores

public PipedReader()public PipedReader(PipedWriter src) throws IOException

Métodospublic void connect(PipedWriter src) throws IOExceptionpublic int read() throws IOExceptionpublic int read(char[] cbuf, int off, int len) throws IOExceptionpublic boolean ready() throws IOExceptionpublic void close() throws IOException

Page 44: Hilos y Multihilos Un thread (hilo, flujo de control del programa) representa un proceso individual ejecutándose en un sistema. A veces se les llama procesos

                                                                                                                

Clase PipedWriter

Constructores

public PipedWriter()public PipedWriter(PipedReader snk) throws IOException

Métodospublic void connect(PipedReader snk) throws IOException public void write(int c) throws IOExceptionpublic void write(char[] cbuf, int off, int len) throws IOExceptionpublic void flush() throws IOExceptionpublic void close() throws IOException

Page 45: Hilos y Multihilos Un thread (hilo, flujo de control del programa) representa un proceso individual ejecutándose en un sistema. A veces se les llama procesos

                                                                                                                

Implementación de Tuberías

Si un programador desea que la salida de datos de algún proceso se convierta en la entrada de otro proceso basta que cree un par estos objetos de esta manera:

PipedOutputStream pos=new PipedOutputStream();PipedInputStream pis=new PipedInputStream(pos);

Page 46: Hilos y Multihilos Un thread (hilo, flujo de control del programa) representa un proceso individual ejecutándose en un sistema. A veces se les llama procesos

                                                                                                                

Implementación de Tuberías

•Hecho esto debe asignar como salida del primer proceso a pos y como entrada del segundo a pis.

•El encadenamiento puede hacerse al revés o creando ambos sin parámetro y usando pis.connect(pos) o pos.connect(pis), da lo mismo.

•Análogamente, para hacer tuberías con corrientes de caracteres, se utilizan PipedWriter y PipedReader.

Page 47: Hilos y Multihilos Un thread (hilo, flujo de control del programa) representa un proceso individual ejecutándose en un sistema. A veces se les llama procesos

                                                                                                                

Tuberías

Ejemplo.- Programa que crea una lista de palabra ritmicas (palabras que riman)

SortThread.java

ReverseThread.java

RhymingWords.java

Page 48: Hilos y Multihilos Un thread (hilo, flujo de control del programa) representa un proceso individual ejecutándose en un sistema. A veces se les llama procesos

                                                                                                                

Tuberías

Ejemplo.- Programa que muestra la diferencia de las tuberías en Unix

mpipes.java