La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

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.

Presentaciones similares


Presentación del tema: "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."— Transcripción de la presentación:

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 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).

2 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.

3 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!" ); }

4 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.

5 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.

6 La clase Thread

7 Métodos de la clase Thread
Métodos de Clase currentThread() yield() sleep( long )

8 Métodos de la clase Thread
Métodos de Instancia start() run() stop() suspend() resume() setPriority( int ) getPriority() setName( String ) getName()

9 Creación de un Thread Modos de conseguir hilos de ejecución (threads) en Java. Extender la clase Thread. Implementando la interfaz Runnable,

10 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() { . . . }

11 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() ; }

12 Arranque de un Thread Ejemplo 1. Muestra la creación de hilos de ejecución extendiendo directamente la clase Thread. EjemploExtendClaseHilo.java Ejemplo 2. Muestra la creación de hilos de ejecución extendiendo directamente la clase Thread. Ejemplo2ExtendHilo.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

13 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().

14 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.

15 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();

16 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.

17 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).

18 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();

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

20 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().

21 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.

22 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.

23 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.

24 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.

25 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.

26 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.

27 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

28 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.

29 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.

30 Sincronización de Hilos
El ejemplo clásico de sincronización hilos es un modelo productor/consumidor Ver. HiloConSincronización.java

31 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.

32 Hilos Demonios 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

33 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.

34

35 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

36 Implementación de Tuberías en Java

37 Tuberías PipedInputStream PipedOutputStream PipedReader PipedWriter
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

38 La clase PipedInputStream

39 La clase PipedInputStream(ii)

40 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

41 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

42 Clase PipedOutputStream
Constructores public PipedOutputStream() public PipedOutputStream(PipedInputStream snk) throws IOException Métodos public void close() throws IOException public void connect(PipedInputStream snk) throws IOException public void flush() throws IOException public void write(byte[] b, int off, int len) throws IOException public void write(int b)

43 Clase PipedReader Constructores Métodos public PipedReader()
                                                                                                                 Clase PipedReader Constructores public PipedReader() public PipedReader(PipedWriter src) throws IOException Métodos public void connect(PipedWriter src) throws IOException public int read() throws IOException public int read(char[] cbuf, int off, int len) throws IOException public boolean ready() throws IOException public void close() throws IOException

44 Clase PipedWriter Constructores Métodos public PipedWriter()
                                                                                                                 Clase PipedWriter Constructores public PipedWriter() public PipedWriter(PipedReader snk) throws IOException Métodos public void connect(PipedReader snk) throws IOException public void write(int c) throws IOException public void write(char[] cbuf, int off, int len) throws IOException public void flush() throws IOException public void close() throws IOException

45 Implementación de Tuberías
                                                                                                                 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);

46 Implementación de Tuberías
                                                                                                                 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.

47                                                                                                                  Tuberías Ejemplo.- Programa que crea una lista de palabra ritmicas (palabras que riman) SortThread.java ReverseThread.java RhymingWords.java

48                                                                                                                  Tuberías Ejemplo.- Programa que muestra la diferencia de las tuberías en Unix mpipes.java


Descargar ppt "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."

Presentaciones similares


Anuncios Google