PCJ Sesión 9: Threads

download PCJ Sesión 9: Threads

If you can't read please download the document

description

Slides de la sesión 9 del curso PCJ (Proyecto Certifícate en Java), tema: Threads

Transcript of PCJ Sesión 9: Threads

  • 1. PCJ: ProyectoCertifcateen Java Sesin 9 Threads Enrique Zamudio Lpez @chochosmx ezamudio

2. Threads

  • Hilos de ejecucin dentro de un mismo proceso

3. Pueden correr de manera simultnea 4. Cualquier programa Java tiene al menos 1 Thread 5. Clasejava.lang.Thread 6. java.lang.Thread

  • Implementajava.lang.Runnable

7. Tiene distintos estados runnable running new dead Waiting / blocked / sleeping 8. Clase java.lang.Thread

  • Mtodos
  • start()

9. interrupt() 10. join() 11. Clase java.lang.Thread

  • Mtodos estticos
  • currentThread()

12. sleep() 13. yield() 14. Mtodos adicionales

  • Implementados en java.lang.Object
  • wait()

15. notify() 16. notifyAll() 17. Definir un Thread

  • Extender la clasejava.lang.Thread

public class Suboptima extends Thread { public void run() { //Hacer el trabajo } } Se sobreescriberun()pero se debe invocar astart() 18. Extender Thread t = new Suboptima(); t. start() ; System.out.println( Calculando PI); public void run() { //Calcular PI } 19. Instanciar un Thread t = new Suboptima(); t. run() ; System.out.println( Calculando PI); Si se invocarun() , se ejecuta en el mismo Thread, no se crea uno nuevo. 20. Definir un Thread

  • Implementar Runnable

public class Optima extends ChuckNorris implements Runnable { public void run() { //Hacer algo } } Podemos extender otras clases 21. Instanciar con Runnable o = new Optima(); t = new Thread(o); t. start() ; System.out.println( Calculando PI); Menos confuso al ver el uso directo de Thread 22. Estados de un Thread Runnable Running New Dead Waiting / blocked / sleeping 23. Ejemplo 1

  • 10 hilos corriendo tareas simultneamente

24. Uso deyield() 25. Prioridades en Threads 26. Mtodos sleep() y join()

  • Mtodosleep()es esttico

27. Mtodojoin()es para esperar otro thread 28. Ambos arrojanInterruptedException 29. Mtodo interrupt()

  • Causa que mtodos que declaranInterruptedExceptionla puedan arrojar

30. Es responsabilidad del programador verificar si el thread ha sido interrumpido 31. Si no se hace nada, el Thread puede continuar su ejecucin 32. Ejemplos 2 y 3

  • Ejemplo dejoin()

33. Ejemplo desleep() 34. Bonus track:Ejemplos de cmo manejar interrupciones 35. Garantas

  • Garantas de la JVM
  • Thread.sleep()tiempo mnimo

No se garantiza:

  • Orden en que corren

36. Que terminen su ejecucin 37. Respeto a prioridades (alta vs baja) 38. Queyield()ceda el CPU 39. Quasi-garanta Un Thread corriendo por lo general no tendr una prioridad inferior a un Thread en estadorunnable . Generalmente, si un Thread de baja prioridad est corriendo cuando un Thread de alta prioridad se vuelverunnable , la JVM pasar el Thread de baja prioridad arunnablepara correr el Thread de alta prioridad. 40. Sincronizacin y Candados

  • Secciones crticas de cdigo
  • Slo un thread debe correr a la vez ciertos segmentos de cdigo

Resolucin

  • Mtodos

41. Mtodos estticos 42. Bloques de cdigo Palabra reservadasynchronized 43. Mtodos public class Ejemplo { publicstatic synchronizedvoid stat1() { } publicstatic synchronizedvoid stat2() { } publicsynchronizedvoid metodo1() { } publicsynchronizedvoid metodo2() { } } 44. synchronized publicsynchronizedvoid metodo() { //codigo } public void metodo() { synchronized( this ) { //codigo } } 45. Sincronizacin public class DrHouse { private Leg badLeg; private Leg goodLeg; private Hand[] hands; publicsynchronizedpatear(Object algo) { goodLeg.kick(algo); } publicsynchronizedgolpear(Object algo) { hands[1].hit(algo); hands[0].hit(algo); } } 46. Sincronizacin public patear(Object algo) { synchronized ( goodLeg ) { goodLeg.kick(algo); } } public synchronized golpear(Object algo) { synchronized ( hands[1] ) { hands[1].hit(algo); } synchronized ( hands[0] ) { hands[0].hit(algo); } } 47. Ejemplo 4

  • Uso desynchronized

48. Deteccin de interrupciones 49. Efecto deyield()con sincronizacin 50. Deadlocks

  • Un hilo esperando una condicin que nunca se va a cumplir... NOT

51. Hilo 1 espera recurso bloqueado por hilo 2... que est esperando recurso bloqueado por hilo 1. 52. Puede darse de manera ms compleja pero casi siempre ser circular. 53. FIX: Siempre bloquear recursos en el mismo orden. 54. Ejemplo 5

  • Deadlock simple

55. Cmo arreglarlo 56. Cena de filsofos 57. Bonus track:ScheduledExecutor 58. Interaccin entre Threads

  • Mtodoswait()ynotify()son dejava.lang.Object

59. Conwait()un Thread puede esperar un aviso de disponibilidad de un recurso 60. Connotify()se avisa a otro Thread (slo a uno) que puede continuar 61. ConnotifyAll()se avisa a todos los Threads que esperan sobre el objeto 62. Importante!

  • Los mtodoswait() ,notify()ynotifyAll()solamente pueden ser invocados desde un contexto sincronizado, para tener un lock sobre el objeto.

63. Ejemplo 6

  • Uso denotify()ywait()

64. Excepciones cuando se usa mal 65. ? 66. Bonus Tracks

  • PipedInputStream y PipedOutputStream

67. java.util.concurrent

  • Executors

68. Thread Pools 69. Colas, arreglos, mapas concurrentes 70. Thread Pools

  • Crear y destruir Threads lleva un costo en CPU y memoria

71. Un Thread puede ejecutar varias tareas 72. Es casi como reutilizar threads 73. Las tareas se ponen en una cola y los Threads las van tomando de ahi para ejecutarlas 74. Estructura de un Thread Pool Thread 1 Thread 2 Thread 3 Threadn r6 r1 r4 r5 r3 r2 r9 r7 r8 Aplicaciones agregan tareas a la cola... ...Threads toman la primera tarea disponible, o esperan si no hay tareas que ejecutar. Cola de tareas (Runnables) 75. Executors

  • Fbrica de thread pools de distintos tipos
  • Cached

76. Fixed Se pueden crear ThreadPools directamente

  • Administracin de los Threads en caso de excepciones

77. Aceptan cualquier Runnable 78. Ejemplo

  • Thread Pool de 1 solo hilo

79. Thread Pool de tamao fijo 80. Thread Pool de tamao variable 81. Piped Streams

  • Dos Streams comunicados

82. Lectura delPipedInputStreambloquea hasta que se escriba alPipedOutputStream 83. Es otra forma de comunicacin entre dos distintos hilos de ejecucin 84. Similar await()ynotify()(pero no hay equivalente denotifyAll() ) 85. Ejemplo

  • Comunicacin usando streams en vez de wait() y notify()

86. Productor usa PipedOutputStream 87. Consumidor usa PipedInputStream 88. BlockingQueue

  • Estructura FIFO con sincronizacin

89. Uno o varios hilos pueden agregar objetos a la cola 90. Uno o varios hilos pueden tomar objetos

  • Slo uno recibe el objeto disponible

El mtodotake()bloquea hasta obtener un objeto