Java Thread

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