Download - hilos - Java

Transcript
Page 1: hilos - Java

ING. LUIGI ALAN CRUZ PONCE

ING. EN SISTEMAS COMPUTACIONALES

INSTITUTO TECNOLOGICO SUPERIOR

DE TAMAZUNCHALE

Page 2: hilos - Java

ING. LUIGI ALAN CRUZ PONCE TOPICOS SELECTOS DE PROGRAMACION

HilosNecesidad de dividir un programa en subtareas

que se ejecuten de manera independiente pero coordinada.

Un hilo es un flujo de control que se ejecuta dentro de un proceso, compartiendo cierta información del estado del proceso.

Un proceso = 1 o más hilos de ejecuciónCada hilo tiene la impresión de tener la CPU

para él, pero en realidad se reparte entre todos los hilos (monoprocesador).

Page 3: hilos - Java

ING. LUIGI ALAN CRUZ PONCE TOPICOS SELECTOS DE PROGRAMACION

Concurrencia en JVM

Proporciona mecanismos de sincronización Creación/destrucción de hilos Exclusión mútua (sincronización) comunicación

java.lang.Thread

Page 4: hilos - Java

ING. LUIGI ALAN CRUZ PONCE TOPICOS SELECTOS DE PROGRAMACION

Creación de Hilos

Thread unHilo = new Thread();public class OtroHilo extends Thread{...} Forma más fácil/rápida de crear un hilo

public class OtroHiloMas implements Runnable {...} Por si debe extender otra clase, sólo obliga a

implementar run()

Page 5: hilos - Java

ING. LUIGI ALAN CRUZ PONCE TOPICOS SELECTOS DE PROGRAMACION

Creación de Hilospublic class SimpleThread extends Thread { private int countDown = 5; private static int threadCount = 0; private int threadNumber = ++threadCount; public SimpleThread() { System.out.println("Making " + threadNumber); } public void run() { while(true) { System.out.println("Thread " + threadNumber + "(" + countDown + ")"); if(--countDown == 0) return; } } public static void main(String[] args) { for(int i = 0; i < 5; i++) new SimpleThread().start(); System.out.println("All Threads Started"); } }

Extender la clase Thread

Sobrecargar métodoThread

Start(): construir obj., Config. Hilo y llamar a run()

Page 6: hilos - Java

ING. LUIGI ALAN CRUZ PONCE TOPICOS SELECTOS DE PROGRAMACION

Clase ThreadMétodos de control:

Crear un thread (constructor Thread).

Iniciar la ejecución (start).

Detener la ejecución (suspend, interrupt, stop, sleep).

Reanudar la ejecución (resume).

Ceder el procesador (yield).

Esperar la terminación de otro thread (join).

Métodos de consulta y modificación de propiedades:

Nombre (getName / setName).

Prioridad (getPriority / setPriority): MIN_PRIORITY (1). NORM_PRIORITY (5), MAX_PRIORITY (10).

Grupo de hilos (getThreadGroup): Cada thread pertenece a un grupo.

Daemon (isDaemon / setDaemon): Indica si el thread es daemon o no.

Page 7: hilos - Java

ING. LUIGI ALAN CRUZ PONCE TOPICOS SELECTOS DE PROGRAMACION

Clase ThreadPlanificación

Política de planificación: Por prioridad y con apropiación.

La prioridad es estática: El algoritmo de planificación no modifica la prioridad de los threads.

Se aplica round robin para 2 threads con igual prioridad.

Sincronización La sincronización entre threads se ofrece a través de

los métodos wait, notify y notifyAll, heredados de la clase java.lang.Object.

Page 8: hilos - Java

ING. LUIGI ALAN CRUZ PONCE TOPICOS SELECTOS DE PROGRAMACION

Sincronización

Evitar condiciones de carreraBloquear el acceso a secciones críticasTodos los objetos tienen un bloqueo

asociado (monitor)Adquirir el bloqueo de un objeto impide que

cualquier otro hilo adquiera ese bloqueo hasta que sea liberado por el hilo que lo posee.

Métodos y sentencias synchronized

Page 9: hilos - Java

ING. LUIGI ALAN CRUZ PONCE TOPICOS SELECTOS DE PROGRAMACION

Monitores Java

EsperaPropietarioEntrada(espera)

liberar

adquirir

liberary salir

acceso exclusivoentrar

hilo

Page 10: hilos - Java

ING. LUIGI ALAN CRUZ PONCE TOPICOS SELECTOS DE PROGRAMACION

Métodos synchronized

Declarar métodos con sección crítica como synchronized: public synchronized sumar(int x){ saldo+=x; } public synchronized restar(int x){ saldo-=x; }

Page 11: hilos - Java

ING. LUIGI ALAN CRUZ PONCE TOPICOS SELECTOS DE PROGRAMACION

Métodos synchronizedAl invocar a un método sincronizado sobre un

objeto1.se adquiere el bloqueo del objeto

2.se ejecuta el cuerpo del método

3.se libera el bloqueo (automáticamente)

Se impide que un hilo se bloquee por un bloqueo que ya posee (invocaciones recursivas):

la posesión de los bloqueos es por hilo, invocar un método sincronizado desde otro método también sincronizado no bloquea

el bloqueo se libera cuando se retorna del método sincronizado más externo

Page 12: hilos - Java

ING. LUIGI ALAN CRUZ PONCE TOPICOS SELECTOS DE PROGRAMACION

Sentencias synchronized

Permiten adquirir el bloqueo de cualquier objeto, no sólo del objeto actual

Para ámbitos menores que un métodosynchronized (expresRefenciaAUnObjeto){ sentencias;}

Permite mantener el bloqueo únicamente el tiempo imprescindible.

Page 13: hilos - Java

ING. LUIGI ALAN CRUZ PONCE TOPICOS SELECTOS DE PROGRAMACION

Sentencias synchronizedclass SumarYRestar{

Object bloqueoSaldo = new Object();

int saldo=0;

public sumar(){

int x = obtenerValor();

synchronized (bloqueoSaldo){

saldo += x;}

}

public restar(){....}

}

Page 14: hilos - Java

ING. LUIGI ALAN CRUZ PONCE TOPICOS SELECTOS DE PROGRAMACION

Comunicación entre Hilossynchronized permite el bloqueo entre hilos,

pero también ha de haber comunicación entre ellos.

wait(): deja al hilo esperando por una condición, liberando el bloqueo sobre el objeto (op. atómica)

synchronized void siCondicion(){ while (!condicion) wait(); // hacer cuando se cumpla la condicion ...}

siempre en un bucle

Page 15: hilos - Java

ING. LUIGI ALAN CRUZ PONCE TOPICOS SELECTOS DE PROGRAMACION

Comunicación entre Hilosnotify(), notifyAll(): indican a los hilos en

espera que la condición puede haberse cumplidosynchronized void cambiarCondicion(){ // se altera algún valor de la condición notifyAll(); // o notify();}

notifyAll() despierta a todos los hilos esperando, notify() selecciona sólo a uno para ser despertado

todos los hilos esperan por la misma condición sólo un hilo como mucho se puede beneficiar

Page 16: hilos - Java

ING. LUIGI ALAN CRUZ PONCE TOPICOS SELECTOS DE PROGRAMACION

Planificación de Hilos

Cada hilo tiene una prioridad asociadaInicialmente recibe la prioridad del hilo que lo

crea Thread.MIN_PRIORITY, Thread.NORM_PRIORITY, Thread.MAX_PRIORITY

getPriority(), setPriority()

Replanificación voluntaria: Espera limitada

sleep(long milis) sleep(long milis, int nanos)

Cesión del turno yield()

Page 17: hilos - Java

ING. LUIGI ALAN CRUZ PONCE TOPICOS SELECTOS DE PROGRAMACION

FinalizaciónUna vez que se un hilo ha empezado a

ejecutarse, está vivo: isAlive() retorna true.

Un hilo continua hasta que termina: el método run() retorna normalmente el método run() finaliza bruscamente se invoca un destroy() sobre el hilo: para el hilo en seco

sin liberar los bloqueos.

Cancelación: Thread.interrup()isInterrupted()interrupt()

Page 18: hilos - Java

ING. LUIGI ALAN CRUZ PONCE TOPICOS SELECTOS DE PROGRAMACION

Esperando a un hilo

Un hilo puede esperar a que otro finalicehiloAlQueEsperar.join()

Page 19: hilos - Java

ING. LUIGI ALAN CRUZ PONCE TOPICOS SELECTOS DE PROGRAMACION

volatileJava garantiza que la lectura o escritura de

cualquier variable (no long ni double) es atómica.El acceso atómico no garantiza que se lea el valor

escrito más recientemente.La sincronización no siempre es necesaria (un

escritor, muchos lectores)volatile indica al compilador que el valor del

campo podrá cambiar en cualquier momento, e impide las suposiciones del compilador sobre ese campo.

Page 20: hilos - Java

ING. LUIGI ALAN CRUZ PONCE TOPICOS SELECTOS DE PROGRAMACION

Estados de un Hilo

runnable

new dead

bloqued

run()

yield()

sleep()

wait()notify()notifyAll()

returninterrupt()

Page 21: hilos - Java

ING. LUIGI ALAN CRUZ PONCE TOPICOS SELECTOS DE PROGRAMACION

Estados de un HiloNew: objeto creado pero no ha sido iniciada su

ejecución.Runnable: se puede ejecutar cuando sea

planificado para utilizar la CPU. Puede o no estár ejecutándose, y no hay razón para que no se ejecute.

Dead: desaparición del hilo, normalmente como efecto de retornar del método run().

Blocked: el hilo podría ejecutarse pero existe algo que lo impide. El planificador no lo tendrá en cuenta hasta que vuelva al estado Runnable.


Top Related