THREADS Materia: Técnicas Digitales 3 1Autor: Jonathan Rubstein.
PCJ Sesión 9: Threads
-
Upload
enrique-zamudio-lopez -
Category
Technology
-
view
3.285 -
download
1
description
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