Académique Documents
Professionnel Documents
Culture Documents
dit
UPM
Tema 3: Concurrencia
/threads
Jos A. Maas
http://jungla.dit.upm.es/~pepe/doc/adsw/index.html
11.3.2013
referencias
http://jungla.dit.upm.es/~pepe/
doc/adsw/
libros/concurrency/index.html
ndice
concurrencia
modelo java: 1 RAM + N aplicaciones ligeras
Theads
propiedades de la concurrencia
correccin (correctness)
seguridad (safety)
vivacidad (liveness)
equidad (fairness)
concurrencia
programacin
programas concurrentes
describen varias actividades que podran
progresar al mismo tiempo
el flujo de ejecucin admite muchas opciones
programas secuenciales
describen 1 actividad
slo hay 1 flujo de ejecucin:
seguir la secuencia de sentencias
concurrencia
concurrencia
se dice que N tareas ejecutan concurrentemente
cuando se reparten el tiempo y/o la CPU para ir
ejecutando
con 1 CPU, la concurrencia es simulada
un ratito la CPU para mi, un ratito para ti
T1
T2
T2
T1
T2
T1
T1
T2
T2
para qu?
para aprovechar mejor las CPUs
para poder dejar una tarea esperando algo
mientras otras pueden ir progresando
ej. interfaces de usuario reactivas
(siempre estn dispuestas)
ej. servidores con varios clientes (ej. www)
ej. sistemas de control industrial
implicaciones
concurrencia implica
competencia
por los recursos comunes
sincronizacin
para coordinar actividades
cooperacin
para intercambiar informacin
ejemplo:
2 amigos preparando la comida
trenes
concurrencia
java: threads
tareas ligeras
memoria RAM comn
con las reglas de visibilidad de java
private, de paquete, pblicas
variables de objeto
(privadas)
variables de objeto
(visibles)
memoria
la memoria comn
bueno: es muy eficiente cambiar de thread:
ligeros
bueno: es muy fcil compartir datos entre threads
malo: es muy fcil que un thread corrompa los
datos de otro
concurrencia
concurrencia
10
concurrencia
11
opcin 2:
class MR implements Runnable {
public void run() { ... }
Thread t1 = new Thread(new MR());
concurrencia
12
concurrencia
13
concurrencia
@Override
public void run() {
try {
while (true) {
System.out.println(id + ": " + new Date());
Thread.sleep(dt * 1000);
}
} catch (InterruptedException e) {
System.out.println(id + ": muerto soy.");
}
}
}
14
ejemplo:
public class RelojTipo3 implements Runnable {
private final String id;
private final BufferedReader console;
public RelojTipo3(String id) {
this.id = id;
console = new BufferedReader(new InputStreamReader(System.in));
}
concurrencia
ejemplo: uso
Thread A1 = new Thread(new RelojTipo1("A1", 3));
Thread A2 = new Thread(new RelojTipo1("A2", 5));
Thread B1 = new RelojTipo2("B1", 7);
Thread B2 = new RelojTipo2("B1", 11);
Thread C = new Thread(new RelojTipo3("C"));
A1.start();
A2.start();
B1.start();
B2.start();
C.start();
Thread.sleep(30 * 1000);
A1.interrupt();
concurrencia
16
interrupciones
desde fuera
void interrupt()
marca en estado interrupted
dentro
static boolean interrupted()
devuelve T | F y elimina el estado (1 vez)
boolean isInterrupted()
devuelve T | F
concurrencia
17
18
19
volatil
algunos campos pueden declararse
volatil
concurrencia
20
setName(String name)
aparecer con el toString()
tambin: new Thread(String name)
void yield()
querida tarea, por favor, deja que ejecuten las dems
java hace lo que le da la gana
(depende del sistema operativo)
void join()
espero a que termine
concurrencia
21
estado
Thread.State getState()
no se puede
volver a arrancar
una tarea terminada
concurrencia
22
prioridad
int getPriority()
void setPriority(int n)
MIN_PRIORITY .. MAX_PRIORITY
mayor prioridad ms CPU
concurrencia
23
24
cuntas threads?
el programa principal
+ las tareas que arrancamos
(hasta que terminen)
+ lo que se le ocurre al IDE
Set<Thread> threadSet =
Thread.getAllStackTraces().keySet();
for (Thread thread : threadSet)
System.out.println(thread);
concurrencia
25
propiedades
correccin (correctness)
da el resultado correcto
seguridad (safety)
no pasa nada malo
vivacidad (liveness)
en algn momento hace lo que se espera
equidad (fairness)
las threads se reparten la CPU con justicia
concurrencia
26
correccin
se genera el resultado correcto
se puede usar JUnit
pruebas unitarias
assertEquals(esperado, obtenido)
27
seguridad - safety
nothing bad ever happens
nunca funciona mal
cosas que pueden ir mal
carreras valores incorrectos
concurrencia
28
vivacidad - livenesss
something good eventually happens
en algn momento hace lo correcto
cosas que pueden ir mal
deadlock interbloqueo
el programa se queda muerto
29
equidad - fairness
los recursos se reparten con justicia
lo contrario
inanicin starvation
a alguna thread nunca se le da oportunidad
concurrencia
30
pruebas
es muy difcil hacer pruebas de las
propiedades
a veces se consigue demostrar usando tcnicas
matemticas
demostracin de teoremas
anlisis de todas las ejecuciones posibles
recomendacin
programar de forma muy bien estructurada para
asegurarnos de que no hay malas combinaciones
concurrencia
31