APLICACIONES MULTIHILOS

13
APLICACIONES MULTIHILOS

description

Descripción de el Uso de Hilos JAVA

Transcript of APLICACIONES MULTIHILOS

Page 1: APLICACIONES MULTIHILOS

APLICACIONES MULTIHILOS

Page 2: APLICACIONES MULTIHILOS

Que es un hilo?

Conocidos también como procesos ligeros.

Un hilo (thread) es un flujo de ejecución secuencial dentro de un proceso.

Un mismo proceso java puede tener

a). Un único hilo (el hilo principal) y por tanto se le llama monotarea.

b). Varios hilos (por ejemplo el hilo principal y el de gestión de eventos). Y por tanto se le llama monotarea.

Page 3: APLICACIONES MULTIHILOS

Ciclo d vida de un Hilo

Page 4: APLICACIONES MULTIHILOS

Clase principal para manejo de Hilos

La clase principal para el manejo de los hilos (Treads)es:

java.lang.Thread

Nos ofrece el API genérico de los threads así como la implementación de su comportamiento, incluyendo los métodos:

Run

Sleep

Wait

Page 5: APLICACIONES MULTIHILOS

Crear un Hiloheredando la clase java.lang.Thread

Implementando de la interfaz java.lang.Runnable

Page 6: APLICACIONES MULTIHILOS

Método Run

El método Run se utiliza para indicar el código a ejecutar de un hilo.

La clase java.lang.Thread contiene un método run() vacío.

public void run(){

//Contenido del Hilo

}

Page 7: APLICACIONES MULTIHILOS

Método Sleep

Se trata de un método estático que, al ser invocado, pone a “dormir” el thread en ejecución durante los milisegundos especificados en el argumento.

public static void sleep(“milisegundos”)

Page 8: APLICACIONES MULTIHILOS

Método Join

El método join() de la clase Thread permite a un hilo “unirse al final” de otro hilo. Si tenemos un hilo B que no puede hacer su trabajo hasta que otro hilo A haya completado el suyo, entonces querremos que el hilo B haga un “join” con A. Esto significa que B no será runnable hasta que A haya terminado (y entrado en el estado dead).

El código anterior toma el hilo actual en ejecución y lo une al final del hilo referenciado por 't‘.

Esto bloquea el hilo actual de volverse runnable hasta que el hilo 't' deje de estar vivo.

Page 9: APLICACIONES MULTIHILOS

Método YieldEl método estático Thread.yield() hace que el hilo actual en ejecución permita que otros hilos con la misma prioridad obtengan su turno.

El método hará que vaya de running a runnable.

Para comprender yield() debemos comprender el concepto de prioridades de hilos. Los hilos siempre se ejecutan con una prioridad, normalmente entre 1 y 10.  En la mayoría de los casos, el hilo en ejecución tendrá una prioridad igual o mayor que el hilo con mayor prioridad en espera.

El comportamiento del planificador de hilos no está garantizado, por lo que las prioridades deben usarse para mejorar la eficiencia de nuestro programa, sin hacer que el programa dependa de dicho comportamiento.

Cuando los hilos tienen la misma prioridad pueden ocurrir 2 cosas:

Tomar un hilo para ejecutarlo y ejecutarlo hasta que se bloquee o complete.

Hacer un reparto de tiempos entre los hilos dándole a todos la misma oportunidad de ejecutarse.

Page 10: APLICACIONES MULTIHILOS

Método Notify

Para enviar una señal a los threads que están esperando en el objeto desde donde enviamos la señal se utiliza el método:

public void notify();

public void notifyAll();

El método notify() elige un thread que está esperando y lo despierta.

Page 11: APLICACIONES MULTIHILOS

Método Wait

El método wait() hace que el thread actual espere, hasta que otro thread se lo notifique. Se utiliza el método wait() en conjunción con el método notify() para coordinar la actividad de varios threads que utilizan los mismos recursos.

Page 12: APLICACIONES MULTIHILOS

Uso de synchronized Cuando en un programa tenemos varios hilos corriendo simultáneamente es posible que varios hilos intenten acceder a la vez a un mismo sitio y es posible que la operación de uno de ellos entorpezca la del otro. Para evitar estos problemas, hay que sincronizar los hilos.

Imagina que escribimos en un fichero usando una variable fichero de tipo PrintWriter. Para escribir uno de los hilos hará esto

fichero.println("En un lugar de la Mancha...");

Mientras que el otro hará esto:

fichero.println("... ser o no ser ...");

Si los dos hilos lo hacen a la vez, sin ningún tipo de sincronización, el fichero al final puede tener esto:

En un ... ser lugar de la o no Mancha ser ...

Page 13: APLICACIONES MULTIHILOS

Para evitarlo debemos sincronizar los hilos. Cuando un hilo escribe en el fichero, debe marcar de alguna manera que el fichero está ocupado. El otro hilo, al intentar escribir, lo verá ocupado y deberá esperar a que esté libre. En java esto se hace fácilmente.

El código sería así:

synchronized (fichero){   fichero.println("En un lugar de la Mancha...");}

y el otro hilo:

synchronized (fichero){   fichero.println("... ser o no ser ...");}

Al poner synchronized(fichero) marcamos fichero como ocupado desde que se abren las llaves de después hasta que se cierran. Cuando el segundo hilo intenta también su synchronized(fichero), se queda ahí bloqueado, en espera que de que el primero termine con fichero.