View
371
Download
1
Embed Size (px)
Citation preview
5/27/2018 Java Thread
1/27
+
Java Threads
Sistemas DistribuidosRodrigo Santamara
5/27/2018 Java Thread
2/27
+Java Threads
Hilos Sincronizacin Ejercicios FAQ
2
5/27/2018 Java Thread
3/27
+Hilos
! Un hilo (Thread) es un proceso en ejecucin dentro de unprograma
java
main
return
Thread tt.start()
run()
finalizacin
! Puede haber varios hilos enejecucin simultnea
! Los hilos implementan prioridad ymecanismos de sincronizacin
! La finalizacin depende del hilo(Thread.suspend,stopestn
depreciados)
! Cualquier clase se puede hacer hilo
! extends Thread
! implements Runnable
3
5/27/2018 Java Thread
4/27
+
publiccl ssPingPong extendsThread{priv teString word;publicPingPong(String s) {word=s;}publicvoidrun(){for(inti=0;i
5/27/2018 Java Thread
5/27
+Hilos
" No hay control por defecto del orden de ejecucin de los hilos" En el ejemplo anterior de dos hilos jugando al ping pong, tenemos
una ejecucin como esta:
" ppppppppPPPPPPPPppppppPPPPPP" Podemos controlar la ejecucin mediante prioridades con
setPriority()
" P. ej., si damos a tP prioridad mxima (Thread.MAX_PRIORITY) ya tp prioridad mnima, tendremos (aunque no asegurado)
" PPPPPPPPPPPPPPpppppppppppppp" Sin embargo, la prioridad no nos permite un control fino de la
ejecucin, ni nos asegura un orden concreto
" Necesidad de mecanismos de sincronizacin
Prioridades
5
5/27/2018 Java Thread
6/27
+Hilos
" Se puede interrumpir la ejecucin de un hilo temporalmente" Thread.sleep(long millis)" til para simular tiempos de procesamiento o timeouts
" La suspensin indefinida (Thread.suspend) y la finalizacin(Tread.stop) estn en desuso (deprecated)
" La parada indefinida o terminante de un hilo slo debe estarcontrolada por dicho hilo
Suspensin
6
5/27/2018 Java Thread
7/27
+Java Threads
Hilos Sincronizacin Ejercicios FAQ
7
5/27/2018 Java Thread
8/27
+Sincronizacin
! Los hilos se comunican generalmente a travs de campos ylos objetos que tienen esos campos
! Es una forma de comunicacin eficiente
! Pero puede plantear errores de interferencias entre hilos
! La sincronizacin es la herramienta para evitar este tipo deproblemas, definiendo rdenes estrictos de ejecucin
8
5/27/2018 Java Thread
9/27
+Sincronizacin
cl ssCounter{priv teintc= 0;publicvoidincrement() { c++; }publicvoiddecrement() { c--; }publicintvalue() { returnc; }}
Dos hilos A y B pueden estropearlo!:
Hilo A: recuperar c (0)Hilo B: recuperar c (0)
Hilo A: incrementar c (1)
Hilo B: decrementar c (-1)
Hilo A: almacenar c (1)
Hilo B: almacenar c (-1)
Interferencia entre hilos
c++ est compuesto de:1. Obtener el valor de c2.Incrementar c en 13.Almacenar el valor de c
c-- est compuesto de:1. Obtener el valor de c2.Decrementar c en 13.Almacenar el valor de c
9
5/27/2018 Java Thread
10/27
+Sincronizacin
" Evita que dos invocaciones de mtodos sincronizados delmismo objeto se mezclen.
" Cuando un hilo ejecuta un mtodo sincronizado de un objeto,todos los hilos que invoquen mtodos sincronizados del objeto sebloquearn hasta que el primer hilo termine con el objeto.
"Al terminar un mtodo sincronizado, se garantiza que todoslos hilos vern los cambios realizados sobre el objeto.
Efectos
10
5/27/2018 Java Thread
11/27
+Sincronizacin
" Cuando un hilo invoca un mtodo sincronizado, adquiere elbloqueo intrnsecodel objeto correspondiente.
" Si invoca un mtodo esttico sincronizado, adquiere elbloqueo intrnseco de la clase, independiente de los de susobjetos
Bloqueo intrnseco
11
5/27/2018 Java Thread
12/27
+SincronizacinSincronizacin de mtodos
cl ssCounter{priv teintc= 0;public synchronizedvoidincrement() { c++; }public synchronizedvoiddecrement() { c--; }publicintvalue() { returnc; }}
" Los mtodos sincronizados se identifican mediante la palabraclave synchronized
" Cualquier hilo que acceda a un mtodo sincronizado de unobjeto deber obtener su bloqueo intrnseco de dicho objeto
" Cualquier hilo que acceda a un mtodo estticosincronizado deun objeto deber obtener el bloqueo intrnseco de su clase
12
5/27/2018 Java Thread
13/27
+SincronizacinEjemplo
Hilo 1
Hilo 2Hilo 3
objeto
mtodos...
...mtodos
mtodosincronizado2
mtodo
sincronizado1
bloqueo
intrnsecodel objeto
tiempo
13
5/27/2018 Java Thread
14/27
+Sincronizacin
! En vez de sincronizar todo un mtodo podemos sincronizaruna porcin de cdigo
! Debemos asociar un atributo u objeto sobre el que se
requiere el bloqueo intrnseco
Sincronizacin de cdigo
publicvoidaddName(String name){synchronized(this)
{lastName = name;
nameCount++;}
nameList.add(name);}
Sincronizamos esta porcin de cdigomediante el bloqueo intrnseco de estemismo objeto (this)
Mientras un hilo est ejecutando estetrozo de cdigo, cualquier hilo queintente acceder a un trozo de cdigosincronizado asociado a este objeto, o aun mtodo sincronizado de este objeto,se bloquear
14
5/27/2018 Java Thread
15/27
+Sincronizacin
" Es un grado ms fino desincronizacin
" Sincronizacin de porciones de
mtodos" Sincronizacin entorno a otros
objetos que no sean el objetopropietario del mtodo o su clase
" El objeto sobre el que sesincroniza suele llamarse testigo
" Si el testigo es un atributoesttico, se bloquea su clase
Sincronizacin de cdigo
publiccl ssMsLunch{priv telongc1= 0;priv telongc2= 0;priv teObject lock1= newObject();priv teObject lock2= newObject();publicvoidinc1()
{synchronized(lock1) { c1++; }}
publicvoidinc2(){synchronized(lock2) { c2++; }}
}
15
5/27/2018 Java Thread
16/27
+Sincronizacin
! Espera ocupada:un proceso espera por un recurso, pero laespera consume CPU! while(!recurso) ;!
Se soluciona con el uso dewait()
! Interbloqueo(deadlock): varios procesos compiten porlos mismos recursos pero ninguno los consigue
! Inanicin: un proceso nunca obtiene los recursos que
solicita, aunque no est interbloqueado
! Autobloqueo: un proceso espera por recursos que ya posee! Solucionado en el ncleo de Java mediante el concepto de
sincronizacin reentrante
Problemas
16
5/27/2018 Java Thread
17/27
+Sincronizacin
" objeto.wait() suspende la ejecucin de un hilo hasta que serecibe una notificacin del objeto sobre el que espera
" Solucin para espera ocupada
" El proceso que espera debe tener el bloqueo intrnseco delobjeto que invoca a wait()
" Si no, da un error (IllegalMonitorStateException)" Una vez invocado, el proceso suspende su ejecucin y libera el
bloqueo
" wait(int time) espera slo durante un tiempo
" objeto.notify()/objeto.notifyAll() informan a uno/todos losprocesos esperando por el objeto que lo invoca de quepueden continuar
wait y notify
17
5/27/2018 Java Thread
18/27
+Sincronizacinpubliccl ssSynchronizedPingPong extendsThread{priv teString word;publicSynchronizedPingPong(String s) {word=s;}publicvoidrun(){synchronized(getClass()){for(inti=0;i
5/27/2018 Java Thread
19/27
+Sincronizacin
Sincronizacin Obtiene bloqueo sobre
synchronized metodo Objeto que contiene el mtodo
static synchronized metodo Clase que contiene el mtodo
synchronized(objeto) objeto
synchronized(objeto.getClass()) Clase instanciada por el objeto
synchronized(objetoEsttico) Clase instanciada por el objeto
Espera Requiere bloqueo sobre
objeto.wait() objeto
objeto.getClass().wait() Clase instanciada por el objeto
objetoEsttico.wait() Clase instanciada por el objeto
Bloqueos intrnsecos: resumen
19
5/27/2018 Java Thread
20/27
+Sincronizacin
"Alternativa a wait/notify" Disponible a partir de Java 1.5
"java.util.concurrent.Semaphore" acquire() funciona de manera similar a wait()" release() funciona de manera similar a notify()" El semforo puede permitir ms de un acceso (permits)" acquire/release pueden adquirir/liberar varios permits.
Semforos
20
5/27/2018 Java Thread
21/27
+SincronizacinDepuracin de interbloqueos
importjava.lang.management.*;...ThreadMXBean tmx= ManagementFactory.getThreadMXBean();long[] ids= tmx.findDeadlockedThreads();if(ids != null)
{ThreadInfo[] infos = tmx.getThreadInfo(ids, true, true);System.out.println("The following threads are deadlocked:");
for(ThreadInfo ti : infos)
System.out.println(ti);}
21
5/27/2018 Java Thread
22/27
+Ejercicio
" Ejecutar las distintas opciones de los ejemplos de PingPong" Sin sincronizacin" Con y sin prioridades de hilos
" Con sincronizacin (wait y notify)" De la clase, del objeto o de un atributo
" Con sincronizacin (Semaphore)
22
5/27/2018 Java Thread
23/27
+Java Threads
Hilos Sincronizacin Ejercicios FAQ
23
5/27/2018 Java Thread
24/27
+Ejercicio
! Modificar el cdigo de la clase PingPong vista comoejemplo en las primeras diapositivas, para obtener lasiguiente salida: PpPpPpPpPp
! Se necesitar hacer uso de synchronized,waity notify! Cuidado con el interbloqueo y la eleccin del testigo
Ping Pong
24
5/27/2018 Java Thread
25/27
+Ejercicio
! Implementar una carrera por relevos:! Tenemos 4 Atletasdispuestos a correr
! Tenemos una clase principal Carrera! Tenemos un objeto esttico testigo! Todos los atletas empiezan parados, uno comienza a correr
(tarda entre 9 y 11s) y al terminar su carrera pasa el testigo aotro que comienza a correr, y as sucesivamente
! Pistas:
- Thread.sleepy Math.randompara simular la carrera- synchronized,waity notifypara el paso del testigo- O utlizar un Semaphorecomo testigo
- System.currentTimeMilliso Calendarpara vertiempos
Carrera 4x100
25
5/27/2018 Java Thread
26/27
+Ejercicio
! Implementar una carrera de 100m lisos:! Tenemos 8 Atletasdispuestos a correr
! Cada uno tiene un atributo dorsal! Tenemos una clase principal Carrera
! Indica el pistoletazo de salida y el resultado de la carrera! Todos los Atletascomienzan pero se quedan parados
esperando el pistoletazo de salida
! Luego comienzan a correr (tardan entre 9 y 11s)
! Al llegar a meta notifican a la carrera su dorsal y terminan! La Carrera escribe preparadosy espera 1s, luego escribe
listosy espera 1s, finalmente escribe ya!y notifica a loshilos de los Atletas
! Cada vez que un atleta le notifica su dorsal, escribe por
pantalla: dorsal+ tarda +System.currentTimeMillis()
Carrera 100m lisos
26
5/27/2018 Java Thread
27/27
27