concurrencia con java

23
1 Tema 1: Concurrencia con Java Programación Programación Concurrente y Concurrente y Distribuida Distribuida Prácticas Prácticas

Upload: juan-beltran

Post on 30-Nov-2015

27 views

Category:

Documents


0 download

DESCRIPTION

Programacion Concurrente y distribuida

TRANSCRIPT

Page 1: Concurrencia Con Java

1

Tema 1: Concurrencia con Java

Programación Programación Concurrente y DistribuidaConcurrente y Distribuida

PrácticasPrácticas

Page 2: Concurrencia Con Java

22

Tem

a 1:

Co

ncu

rren

cia

con

Jav

a

Índice:

1. Hilos

2. Control de hilos

3. Planificación

4. Coordinación de hilos

5. Hilos demonios

Page 3: Concurrencia Con Java

33

Tem

a 1:

Co

ncu

rren

cia

con

Jav

a

Índice:

1. Hilos

2. Control de hilos

3. Planificación

4. Coordinación de hilos

5. Hilos demonios

Page 4: Concurrencia Con Java

4

1. Hilos Hilo: secuencia de ejecución dentro de un proceso Todo programa Java tiene al menos un hilo:

Tem

a 1:

Co

ncu

rren

cia

con

Jav

a

class principal{ … public static void main (String args[]) { . . . }}

Dicho hilo principal puede crear nuevos hilos Java soporta mecanismos de sincronización entre

hilos

Page 5: Concurrencia Con Java

5

1. Hilos Formas de crear hilos en Java:

Por herenciaPor delegación

Tem

a 1:

Co

ncu

rren

cia

con

Jav

a

class miHilo extends Thread{

}

Creación de hilos por herencia Pasos a seguir:

…public void run(){ …}

… miHilo hilo= new miHilo(...);

hilo.start();…

hilo.setPriority(…);hilo.setDaemon(…);…hilo.run();…hilo.suspend();…

Page 6: Concurrencia Con Java

6

1. Hilos

Tem

a 1:

Co

ncu

rren

cia

con

Jav

a

Creación de hilos por herencia (cont.) Objetos de clase miHilo son objetos Thread

Heredan la funcionalidad de Thread: pueden usar los métodos dicha clase para controlarse a sí mismos

Inconveniente:En Java: herencia simple…¿Y si necesitamos heredar funcionalidad de otra clase?

Page 7: Concurrencia Con Java

7

1. Hilos

Tem

a 1:

Co

ncu

rren

cia

con

Jav

a

class miHilo implements Runnable{

}

Creación de hilos por delegación Pasos a seguir:

…public void run(){ …}

… miHilo hilo= new miHilo(...);

t.start();…

t.setPriority(…);t.setDaemon(…);…

Thread t= new Thread(hilo);

Que clase sea de objetos activos no condiciona diseño Inconveniente:

El hilo no puede controlarse a sí mismo

Page 8: Concurrencia Con Java

8

1. Hilos

Tem

a 1:

Co

ncu

rren

cia

con

Jav

a

class miHilo implements Runnable{

public void run() {

… }}

Solución: siguiente patrón de delegación

private Thread hilo;…public miHilo(…){ hilo= new Thread(this); …

}hilo.start();

hilo.suspend();

Page 9: Concurrencia Con Java

99

Tem

a 1:

Co

ncu

rren

cia

con

Jav

a

Índice:

1. Hilos

2. Control de hilos

3. Planificación

4. Coordinación de hilos

5. Hilos demonios

Page 10: Concurrencia Con Java

10

2. Control de hilos Clase Thread: proporciona métodos de control Algunos de los más importantes:

Tem

a 1:

Co

ncu

rren

cia

con

Jav

a

Método Descripción

void start() Inicia la ejecución de un hilo

static Thread currentThread()

Proporciona referencia a hilo actual

string getName() Devuelve nombre de un hilo

void setName() Establece el nombre de un hilo

void sleep (long milis[, int nanos])

Suspende hilo por un tiempo determinado

void suspend(); Suspende hilo hasta que se reanude por resume()

void resume(); Reanuda un hilo suspendido

void stop(); Aborta un hilo

Page 11: Concurrencia Con Java

11

2. Control de hilos

Tem

a 1:

Co

ncu

rren

cia

con

Jav

a Método Descripción

void interrupt() Interrumpe un hilo

boolean interrupted()Comprueba si hilo ha sido interrumpido, y limpia la bandera de interrumpido

boolean isInterrupted() Comprueba si hilo ha sido interrumpido

void join()Hace esperar al hilo llamante hasta que termine el hilo sobre el que se llama.

boolean isAlive()Comprueba si se ha llamado a start() pero aún no ha terminado el hilo.

Page 12: Concurrencia Con Java

1212

Tem

a 1:

Co

ncu

rren

cia

con

Jav

a

Índice:

1. Hilos

2. Control de hilos

3. Planificación

4. Coordinación de hilos

5. Hilos demonios

Page 13: Concurrencia Con Java

13

3. Planificación Planificación basada en prioridades estáticas Cada hilo tiene una prioridad entre

Thread.MIN_PRIORITYThread.MAX_PRIORITYPor defecto: Thread.NORM_PRIORITY

No se garantiza que haya apropiación entre hilos de la misma prioridad

Tem

a 1:

Co

ncu

rren

cia

con

Jav

a

Métodos relacionados con la planificación

Descripción

void setPriority() Establece prioridad de un hilo

int getPriority() Obtiene la prioridad de un hilo

void yield()Cede la CPU al planificador para dar la oportunidad de activarse a otros hilos

Page 14: Concurrencia Con Java

1414

Tem

a 1:

Co

ncu

rren

cia

con

Jav

a

Índice:

1. Hilos

2. Control de hilos

3. Planificación

4. Coordinación de hilos

5. Hilos demonios

Page 15: Concurrencia Con Java

15

4. Coordinación de hilos Objetos Java: similares a monitores (Hoare)

Tem

a 1:

Co

ncu

rren

cia

con

Jav

a

monitor mimonitor

{ private:

public:

}

void metodo1 (){

}void metodo2 (){ …}

Datos y métodos locales, variables de condición

Métodos públicos

Page 16: Concurrencia Con Java

16

4. Coordinación de hilos

Tem

a 1:

Co

ncu

rren

cia

con

Jav

a

monitor mimonitor

{ private:

public:

}

void metodo1 (){

}void metodo2 (){

}

condition C;

if (tengo_que_esperar()) wait(C);

signal(C);

Page 17: Concurrencia Con Java

17

4. Coordinación de hilos

Tem

a 1:

Co

ncu

rren

cia

con

Jav

a

Objetos java: modelo simplificadoGarantizan la exclusión mutua entre métodos synchronizedNo hay variables de condición

wait(C) wait()Método heredado de ObjectSólo en métodos declarados synchronizedPuede lanzar la excepción InterruptedException

signal(C) notify()Método heredado de ObjectSólo en métodos declarados synchronizedReanuda cualquier hilo detenido en cualquier wait() del

objetoPolítica de reanudación: preferencia al hilo reanudante Problema: dificultad para implementar esperas guardadas

Page 18: Concurrencia Con Java

18

class miclase

{ synchronized public void metodo1(…) { … while(tengo_que_esperar()) wait(); … }

synchronized public void metodo2(…) { … cambiar_condicion(); notifyAll(); … }}

4. Coordinación de hilos

Tem

a 1:

Co

ncu

rren

cia

con

Jav

a

try{ wait();} catch(InterruptedException e) {};

…throws InterruptedException

Page 19: Concurrencia Con Java

19

4. Coordinación de hilos

Tem

a 1:

Co

ncu

rren

cia

con

Jav

a

Inconvenientes de modelo JavaNotifyAll(): Ineficiente, para reanudar un hilo de entre N:

• Reanudar N hilos

• Efectuar N evaluaciones

• Suspender N-1 hilos

Notify(): soluciones complejas y difíciles de reusar y mantener

synchronized debe ser explícito: dificulta la reutilización Atributos volatile: pueden ser actualizados de manera concurrente

Buena práctica: atributos privados y modificados con exclusión mutua

Sentencia synchronize (no recomendada):

synchronize (expr){ …}…

Page 20: Concurrencia Con Java

20

class pila { private Vector elementos= new Vector() synchronized public void apilar(Object elemento) { elementos.add(elemento); notifyAll(); } synchronized public Object desapilar() { while(elementos.isEmpty ()) try{ wait() } catch (InterruptedException e){e.printStackTrace();} Object resultado= elementos.elementAt(elementos.size()-1); elementos.removeElementAt(elementos.size()-1); return resultado; }}

4. Coordinación de hilos

Tem

a 1:

Co

ncu

rren

cia

con

Jav

a

Page 21: Concurrencia Con Java

2121

Tem

a 1:

Co

ncu

rren

cia

con

Jav

a

Índice:

1. Hilos

2. Control de hilos

3. Planificación

4. Coordinación de hilos

5. Hilos demonios

Page 22: Concurrencia Con Java

22

5. Hilos demonios

Tem

a 1:

Co

ncu

rren

cia

con

Jav

a

Dos tipos de hilos en Java:Hilos de usuario (por defecto)Hilos demonio

La aplicación Java termina cuando terminan todos los hilos de usuario

Utilidad hilos demonio: actividades en segundo plano El carácter de demonio de un hilo se le ha de asignar

antes de iniciarlo (configuración)

Métodos Descripción

void setDaemon (boolean d)

Establece o elimina el carácter de demonio al hilo

Boolean isDaemon () Obtiene el carácter de demonio del hilo

Page 23: Concurrencia Con Java

23