031 threads
DESCRIPTION
Manual hilos javaTRANSCRIPT
-
Anlisis y diseo de software 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
The Java tutorials: Concurrency
http://docs.oracle.com/javase/tutorial/ essential/concurrency/
Java Concurrency in Practice
B. Goetz et al. Addison-Wesley, 2006
concurrencia 2
-
ndice
concurrencia modelo java: 1 RAM + N aplicaciones ligeras
Theads clases Thread & Runnable arrancar threads parar threads varios
propiedades de la concurrencia correccin (correctness) seguridad (safety) vivacidad (liveness) equidad (fairness)
concurrencia 3
-
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 4
-
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
con varias CPUs, parte es paralelismo real, parte es paralelismo simulado repartiendo t
concurrencia 5
T1 T2 T2 T2 T2 T2 T1 T1 T1
t
-
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
porque la solucin natural es concurrente
porque el mundo real es concurrente
concurrencia 6
-
implicaciones
concurrencia implica competencia
por los recursos comunes
sincronizacin para coordinar actividades
cooperacin para intercambiar informacin
ejemplo: 2 amigos preparando la comida
trenes
concurrencia 7
-
java: threads
tareas ligeras
memoria RAM comn
con las reglas de visibilidad de java
private, de paquete, pblicas
concurrencia 8
cdigo (read only)
variables de clase (compartidas)
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 9
-
memoria: variables locales
cada thread tiene sus variables locales
parmetros o argumentos de mtodos
variables creadas dentro de los mtodos
en principio son privadas; pero puede haber comparticin si se pasan referencias
concurrencia 10
-
memoria compartida: carreras
carreras (race conditions)
1. yo me traigo el dato a mi memoria local
2. tu te llevas el dato a tu memoria local
3. modificamos nuestros datos
4. yo lo devuelvo, tu lo devuelves
5. quin tiene la ltima palabra?
concurrencia 11
-
cmo crear threads?
opcin 1:
class MiTarea extends Thread { public void run() { ... }
MiTarea t1 = new MiTarea();
opcin 2:
class MR implements Runnable { public void run() { ... }
Thread t1 = new Thread(new MR());
concurrencia 12
-
ejemplo: implements Runnable
concurrencia 13
public class RelojTipo1 implements Runnable { private final String id; private final int dt; public RelojTipo1(String id, int dt) { this.id = id; this.dt = dt; }
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."); } } }
-
ejemplo: extends Thread
concurrencia 14
public class RelojTipo2 extends Thread { private final String id; private final int dt; public RelojTipo2(String id, int dt) { this.id = id; this.dt = dt; }
@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."); } } }
-
ejemplo:
concurrencia 15
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)); } public void run() {
try { while (true) { String line = console.readLine(); if (line.equals(".")) break; System.out.printf("%s: %s: %s%n", new Date(), id, line); } System.out.println(id + ": muerto soy."); } catch (IOException e) { System.out.println(id + ": " + e); } }
-
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
-
uso interno de interrupted
concurrencia 18
try { Thread.sleep(s * 1000); } catch (InterruptedException e) { // habr que hacer algo }
if (isInterrupted()) { // habr que hacer algo }
muchas operaciones de espera pueden verse interrumpidas
otra opcin es chequear cuando nos venga bien
-
cundo termina un thread?
cuando termina el mtodo run()
concurrencia 19
public class Tarea extends Thread {
private volatile boolean funcionando = true;
@Override
public void run() {
while (funcionando) {
}
}
public void parar() {
this.funcionando = false;
}
}
-
volatil
algunos campos pueden declararse
volatil
con esto se le dice a la mquina virtual java
esa variable puede cambiar en cualquier momento
no la metas en tu memoria privada (por ejemplo, en la cach de la CPU)
concurrencia 20
-
otros mtodos tiles
sleep(long ms) prate un ratito
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()
concurrencia 22
no se puede volver a arrancar una tarea terminada
-
prioridad
int getPriority()
void setPriority(int n)
MIN_PRIORITY .. MAX_PRIORITY
mayor prioridad ms CPU
concurrencia 23
-
mtodos que NO se deben usar
stop()
suspend()
resume()
lo suyo es controlar con campos lo que hace run()
veremos sincronizadores para detener una tarea hasta que se de una condicin
concurrencia 24
-
cuntas threads?
el programa principal
+ las tareas que arrancamos (hasta que terminen)
+ lo que se le ocurre al IDE
Set 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)
OJO debe generar SIEMPRE el resultado correcto
problema: indeterminismo:
a veces s, a veces no
concurrencia 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
livelock bloqueo activo
el programa da vueltas y vueltas sin sentido crculo vicioso
concurrencia 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