Your SlideShare is downloading. ×
PCJ Sesión 9: Threads
PCJ Sesión 9: Threads
PCJ Sesión 9: Threads
PCJ Sesión 9: Threads
PCJ Sesión 9: Threads
PCJ Sesión 9: Threads
PCJ Sesión 9: Threads
PCJ Sesión 9: Threads
PCJ Sesión 9: Threads
PCJ Sesión 9: Threads
PCJ Sesión 9: Threads
PCJ Sesión 9: Threads
PCJ Sesión 9: Threads
PCJ Sesión 9: Threads
PCJ Sesión 9: Threads
PCJ Sesión 9: Threads
PCJ Sesión 9: Threads
PCJ Sesión 9: Threads
PCJ Sesión 9: Threads
PCJ Sesión 9: Threads
PCJ Sesión 9: Threads
PCJ Sesión 9: Threads
PCJ Sesión 9: Threads
PCJ Sesión 9: Threads
PCJ Sesión 9: Threads
PCJ Sesión 9: Threads
PCJ Sesión 9: Threads
PCJ Sesión 9: Threads
PCJ Sesión 9: Threads
PCJ Sesión 9: Threads
PCJ Sesión 9: Threads
PCJ Sesión 9: Threads
PCJ Sesión 9: Threads
PCJ Sesión 9: Threads
PCJ Sesión 9: Threads
PCJ Sesión 9: Threads
PCJ Sesión 9: Threads
PCJ Sesión 9: Threads
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

PCJ Sesión 9: Threads

3,261

Published on

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

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

Published in: Technology, Business
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
3,261
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
131
Comments
0
Likes
1
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. PCJ: Proyecto Certifícate en Java Sesión 9 Threads Enrique Zamudio López @chochosmx ezamudio
  • 2. Threads
    • Hilos de ejecución dentro de un mismo proceso
    • 3. Pueden correr de manera simultánea
    • 4. Cualquier programa Java tiene al menos 1 Thread
    • 5. Clase java.lang.Thread
  • 6. java.lang.Thread
    • Implementa java.lang.Runnable
    • 7. Tiene distintos estados
    runnable running new dead Waiting / blocked / sleeping
  • 8. Clase java.lang.Thread
  • 11. Clase java.lang.Thread
    • Métodos estáticos
  • 14. Métodos adicionales
    • Implementados en java.lang.Object
  • 17. Definir un Thread
    • Extender la clase java.lang.Thread
    public class Suboptima extends Thread { public void run() { //Hacer el trabajo } } Se sobreescribe run() pero se debe invocar a start()
  • 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 invoca run() , 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 simultáneamente
    • 24. Uso de yield()
    • 25. Prioridades en Threads
  • 26. Métodos sleep() y join()
    • Método sleep() es estático
    • 27. Método join() es para esperar otro thread
    • 28. Ambos arrojan InterruptedException
  • 29. Método interrupt()
    • Causa que métodos que declaran InterruptedException la 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 ejecución
  • 32. Ejemplos 2 y 3
    • Ejemplo de join()
    • 33. Ejemplo de sleep()
    • 34. Bonus track: Ejemplos de cómo manejar interrupciones
  • 35. Garantías
    • Garantías de la JVM
      • Thread.sleep() tiempo mínimo
    • No se garantiza:
      • Orden en que corren
      • 36. Que terminen su ejecución
      • 37. Respeto a prioridades (alta vs baja)
      • 38. Que yield() ceda el CPU
  • 39. Quasi-garantía Un Thread corriendo por lo general no tendrá una prioridad inferior a un Thread en estado runnable . Generalmente, si un Thread de baja prioridad está corriendo cuando un Thread de alta prioridad se vuelve runnable , la JVM pasará el Thread de baja prioridad a runnable para correr el Thread de alta prioridad.
  • 40. Sincronización y Candados
    • Secciones críticas de código
      • Sólo un thread debe correr a la vez ciertos segmentos de código
    • Resolución
      • Métodos
      • 41. Métodos estáticos
      • 42. Bloques de código
    • Palabra reservada synchronized
  • 43. Métodos public class Ejemplo { public static synchronized void stat1() { } public static synchronized void stat2() { } public synchronized void metodo1() { } public synchronized void metodo2() { } }
  • 44. synchronized public synchronized void metodo() { //codigo } public void metodo() { synchronized ( this ) { //codigo } }
  • 45. Sincronización public class DrHouse { private Leg badLeg; private Leg goodLeg; private Hand[] hands; public synchronized patear(Object algo) { goodLeg.kick(algo); } public synchronized golpear(Object algo) { hands[1].hit(algo); hands[0].hit(algo); } }
  • 46. Sincronización 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 de synchronized
    • 48. Detección de interrupciones
    • 49. Efecto de yield() con sincronización
  • 50. Deadlocks
    • Un hilo esperando una condición 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 más compleja pero casi siempre será circular.
    • 53. FIX: Siempre bloquear recursos en el mismo orden.
  • 54. Ejemplo 5
    • Deadlock simple
    • 55. Cómo arreglarlo
    • 56. Cena de filósofos
    • 57. Bonus track: ScheduledExecutor
  • 58. Interacción entre Threads
    • Métodos wait() y notify() son de java.lang.Object
    • 59. Con wait() un Thread puede esperar un aviso de disponibilidad de un recurso
    • 60. Con notify() se avisa a otro Thread (sólo a uno) que puede continuar
    • 61. Con notifyAll() se avisa a todos los Threads que esperan sobre el objeto
  • 62. Importante!
    • Los métodos wait() , notify() y notifyAll() solamente pueden ser invocados desde un contexto sincronizado, para tener un lock sobre el objeto.
  • 63. Ejemplo 6
    • Uso de notify() y wait()
    • 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 Thread n 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
    • Fábrica de thread pools de distintos tipos
    • Se pueden crear ThreadPools directamente
      • Administración de los Threads en caso de excepciones
      • 77. Aceptan cualquier Runnable
  • 78. Ejemplo
    • Thread Pool de 1 solo hilo
    • 79. Thread Pool de tamaño fijo
    • 80. Thread Pool de tamaño variable
  • 81. Piped Streams
    • Dos Streams comunicados
    • 82. Lectura del PipedInputStream bloquea hasta que se escriba al PipedOutputStream
    • 83. Es otra forma de comunicación entre dos distintos hilos de ejecución
    • 84. Similar a wait() y notify() (pero no hay equivalente de notifyAll() )
  • 85. Ejemplo
    • Comunicación usando streams en vez de wait() y notify()
    • 86. Productor usa PipedOutputStream
    • 87. Consumidor usa PipedInputStream
  • 88. BlockingQueue
    • Estructura FIFO con sincronización
    • 89. Uno o varios hilos pueden agregar objetos a la cola
    • 90. Uno o varios hilos pueden tomar objetos
      • Sólo uno recibe el objeto disponible
    • El método take() bloquea hasta obtener un objeto

×