Your SlideShare is downloading. ×
0
Concurrencia
Concurrencia
Concurrencia
Concurrencia
Concurrencia
Concurrencia
Concurrencia
Concurrencia
Concurrencia
Concurrencia
Concurrencia
Concurrencia
Concurrencia
Concurrencia
Concurrencia
Concurrencia
Concurrencia
Concurrencia
Concurrencia
Concurrencia
Concurrencia
Concurrencia
Concurrencia
Concurrencia
Concurrencia
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

Concurrencia

83

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
83
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
5
Comments
0
Likes
0
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. 1 Sun Educación México Concurrencia
  • 2. 2 Sun Educación México Multitarea • La multitarea es un mecanismo mediante el cual se pueden ejecutar muchas actividades de manera concurrente en un computador. Existe una distinción importante entre: > Multitarea basada en proceso – Consiste en que muchos programas pueden ejecutarse de manera concurrente en la misma maquina. > Multitarea basada en hilos – Consiste en que distintas partes de un programa puedan ejecutarse de manera independiente. > Cada parte de un programa define una “vía” distinta de ejecución, y se conoce como hilo (Thread) de ejecución.
  • 3. 3 Sun Educación México Hilo (Thread) • Un hilo es una vía de ejecución que se ejecuta dentro de un programa, pero de manera separada. > En tiempo de ejecución los hilos comparten memoria, datos y código, así como el proceso de ejecución del programa (que contiene a los hilos) • Ambiente de ejecución asíncrono > Realizar distintas tareas concurrentemente. • Es necesario comprender los siguientes aspectos centrales de la programación con múltiples hilos en Java: > Creación de hilos, incluye el código que será ejecutado por el hilo. > Como los hilos pueden compartir la memoria, organizar el acceso a datos o códigos comunes a través de la sincronización. > Comprender los diferentes estados de un hilo y las transiciones respectivas.
  • 4. 4 Sun Educación México Hilo Principal • Debemos distinguir entre los siguientes hilos: > Hilos de usuario (los que programamos) > Hilos de sistema -deamon- (se crea automáticamente con el método main()) • Cuando se detiene el hilo de sistema (se conoce como “main thread”) se verifica que no existan hilos de usuario corriendo, en este caso el programa finaliza. • El status de un hilo puede ser cambiado usando el método setDaemon(boolean), pero se debe hacer antes de ejecutar el hilo, de otro modo se produce la excepción IlegalThreadStatusExcepcion. • Si no podemos podemos ejecutar este metodo, desde el hilo actual se lanza la excepcion: SecurityException
  • 5. 5 Sun Educación México Creación de un Hilo • La creación de un hilo puede efectuarse de dos maneras: > Implementando la interfaz java.lang.Runnable • La interfaz define un único método run(), el cual debe ser implementado y constituye el código de programa correspondiente al hilo. • El hilo finaliza (ó muere) cuando el método run() finaliza. > Para crear un hilo es necesario seguir estos pasos: > La clase que implementa la interfaz Runnable debe proveer el método run() el cual será ejecutado por el hilo. > Se crea un objeto de la clase Thread pasando como argumento el objeto que implementa la interfaz Runnable. > Se invoca el metodo start() sobre el objeto “Thread”, retornando inmediatamente después que el hilo sea elegible para su ejecución.
  • 6. 6 Sun Educación México Constructores • Existen varios constructores de la clase Thread, dos de ellos son descritos: > Thread(Runnable target) > Thread(Runnable target, String nombre) • Extendiendo la clase java.lang.Thread > Para crear un hilo es necesario seguir estos pasos: > Extender la clase Thread y sobrescribir el método run() el cual define el código que será ejecutado por el hilo. > El constructor de esta clase debe llamar al constructor de la clase Thread explícitamente. > El método start() heredado desde la Thread debe ser ejecutado para que el hilo sea elegible para su ejecución. > La clase Thread implementa la interfaz Runnable.
  • 7. 7 Sun Educación México Sincronización • Los hilos pueden compartir el mismo espacio de memoria, por lo tanto comparten recursos. • En ciertas circunstancias desearemos que solo un Thread a la vez tenga acceso a un recurso compartido, por ejemplo para garantizar su integridad.
  • 8. 8 Sun Educación México Monitores • Los monitores (ó semáforos) son utilizados para sincronizar el acceso a un recurso compartido. • Un “fragmento” de código, representa un recurso compartido, y puede ser asociado a un monitor. • Los hilos que quieran tener acceso a un recurso compartido, primero verificaran el monitor asociado con el recurso.
  • 9. 9 Sun Educación México Mecanismo de Control • Este mecanismo del monitor asegura las siguiente reglas de sincronización: > Que otro hilo no “entre” al monitor si otro hilo ya lo obtuvo, pasando a un estado de esperar (wait) hasta que el monitor este disponible. > Cuando un hilo sale del monitor, el hilo en espera lo obtiene y puede proceder al recurso compartido asociado al monitor. • Todos los objetos en Java tienen un monitor, y cada objeto puede usar este bloqueo, para proveer la sincronización de acceso a los recursos compartidos.
  • 10. 10 Sun Educación México Mecanismos de Sincronización • Existen dos manera de sincronizar el código: > Sincronizar métodos > Sincronizar un bloque
  • 11. 11 Sun Educación México Sincronizar métodos • Para sincronizar un método solo hay que agregar el modificador synchronized en la definición del método. • Automáticamente se genera un monitor el cual debe ser obtenido por un objeto antes de ejecutar el método. > No se requiere hacer nada especial para obtener el monitor, ya que se realiza de manera implícita en la ejecución de este. > Si NO se obtiene el monitor el hilo “cliente” queda automáticamente en estado de espera • Mientras un hilo se encuentra “dentro” de un método sincronizado de un objeto, todos los demás hilos que quieran ejecutar este método sincronizado deberán esperar. • Cada método puede invocar a otros métodos sincronizados que no se encuentren bloqueados.
  • 12. 12 Sun Educación México Consideraciones • Los métodos no sincronizados pueden ser ejecutados en cualquier momento y por cualquier hilo. • Los métodos sincronizados pueden ser estáticos. • En este caso la clase es la que tiene el monitor, análogamente a un objeto.
  • 13. 13 Sun Educación México Sincronizar un bloque • Un bloque sincronizado permite que un código sea sincronizado en función de un monitor de un objeto arbitrario. • La sintaxis es: > synchronized (referencia) { bloque de código } • El bloque de código por lo general esta relacionado a la referencia del objeto, pero esto no es regla. • Para que un hilo pueda entrar al bloque de código deberá obtener primero el monitor sobre la referencia. • La diferencia con un método sincronizado es que permite una sincronización mas fina de un código en función de un objeto. • La especificación de un objeto (referencia) es mandatorio, sin embargo una clase puede elegir sincronizar una parte de un método, utilizando la referencia this. Las llaves del bloque son obligatorias aunque la clase tenga una sola línea.
  • 14. 14 Sun Educación México Transición de Hilos • Un hilo puede estar en los siguientes estados: • Ejecución (Running): Actualmente la CPU esta ejecutando el hilo. El “thread scheduler” decide que hilo se encuentra en ejecución. • No Ejecución (Non-Runanable): Un hilo puede pasar del estado ejecución a uno de los siguientes estados, dependiendo de la transición. > Espera (Waiting): Desde el estado Ejecución, se invoca al método wait() (clase Object). Para salir de este estado debe ser notificado por otro hilo para pasar “Listo para ejecutarse (Ready-to-run)”
  • 15. 15 Sun Educación México Transición de Hilos > Durmiendo (Sleeping): Desde el estado Ejecución se invoca al método estático de la clase Thread sleep(), quedando en este estado por un periodo determinado de tiempo, posteriormente pasa al estado “Listo para ejecutarse (Ready-to-run)” > Bloqueado (Blocked): Puede pasar a este estado cuando se ejecuta una operación de bloque, como por ejemplo un método I/O o cuando se intenta obtener un monitor y no se consigue. Una vez que la operación de bloqueo finaliza pasa al estado “Listo para ejecutarse (Ready-to-run)”
  • 16. 16 Sun Educación México Transición de Hilos • Listo para ejecutarse (Ready-to-run): Un hilo no pasa directamente al estado ejecución desde un estado de espera, si no que se considera elegible para la ejecución. Una llamada al método estático yield() (clase Thread) permite pasar a este estado un hilo que se encuentra actualmente en ejecución. Es el “thread scheduler” el que decide que hilo se ejecuta. • Muerto (Dead): Un hilo puede pasar a este estado desde Ejecución o “Listo para ejecutarse”, ya sea por que sea completado su ejecución o por que ha sido terminado.
  • 17. 17 Sun Educación México Ciclo de Vida Nuevo EjecuciónNo Ejecución Listo Muerto
  • 18. 18 Sun Educación México Prioridad de Hilos • Los hilos tienen asignada una prioridad la cual es utilizada por el programador de hilos (Thread Scheduler) para determinar que hilo es ejecutado. • El hilo seleccionado será (usualmente) el que tenga la mayor prioridad y que este en el estado “Listo para ejecutarse”. • No necesariamente será el que este mayor tiempo esperando. • Las prioridades son valores enteros que van desde 1 (definido por la constante Thread.MIN_PRIORITY) hasta 10 (definido por la constante Thread.MAX_PRIORITY). Si no se indica la prioridad explícitamente se asignara la prioridad 5 (definido por la constante Thread.NORM_PRIORITY). • Los hilos heredan la prioridad desde el hilo padre. La prioridad puede ser asignada a través del método setPriority() y obtenida con getPriority(), ambos de la clase Thread.
  • 19. 19 Sun Educación México • El programador (scheduler) de hilos utiliza alguna de estas dos estrategias. • Programación preventiva > Si un hilo tiene mayor prioridad que el hilo actual, este ultimo será trasladado al estado “Listo para ejecutarse”, permitiendo que el hilo de mayor prioridad se ejecute. • Programación basada en tiempo o “Round Robin” > Cada hilo esta “autorizado” para ejecutarse durante un periodo determinado de tiempo, posteriormente queda en el estado “Listo para ejecutarse” hasta su nuevo turno. • La elección de la estrategia depende de la implementación de la plataforma, por lo tanto la ejecución de un hilo no es predecible. Programador de Hilos (scheduler)
  • 20. 20 Sun Educación México Programador de Hilos (scheduler) • La llamada al método estático yield() de la clase Thread, causa que el hilo actual pase al estado listo para ejecutarse, quedando a merced del programador de hilos. > Si hay hilos en estado listo para ejecutarse, se determinara según la prioridad cual será ejecutado. > Si no hay hilos en espera, se continúa con la ejecución. > Un uso común de este método es para permitir la ejecución de otro hilo, desde uno que se encuentra usando la CPU de manera exhaustiva. • Nota: Si tenemos un objeto (hilo) y llamamos sobre el método yield() NO tendrá el efecto esperado y el hilo actual será considerado por el método.
  • 21. 21 Sun Educación México Durmiendo y Despertando • La llamada al método estático sleep() de la clase Thread causa que el hilo pase al estado “Durmiendo” liberando la CPU. Este método se encuentra sobrecargado, una versión de este: > public static void sleep (long milisegundos) > Este método pasa al hilo al estado “durmiendo” por un tiempo determinado por el parámetro milisegundos, posteriormente pasa al estado listo para ejecutarse, para esperar por su nuevo turno.
  • 22. 22 Sun Educación México Espera y Notificación • La espera y notificación provee un mecanismo de comunicación entre objetos que sincronizan el mismo objeto. • Los siguientes métodos de instancia de la clase Object pueden ser utilizados para este propósito. > void wait(long tiempoMaximo) throws InterruptedException > void wait(long tiempoMaximo, int nanos) throws InterruptedException > void wait() throws InterruptedException > void notify() > void notifyAll()
  • 23. 23 Sun Educación México Espera y Notificación • Los métodos sobrecargados wait() están diseñados para un hilo, el cual debe esperar a que alguna condición se cumpla, pudiendo pasar del estado Ejecución al estado de Espera hasta que la condición ocurra. • Para llamar al método wait() el hilo debe tener el monitor del objeto. > Por lo tanto solo puede ser usado en un contexto sincronizado. • Cuando pasa al estado “Esperando”, el hilo renuncia al monitor del objeto. > Ambas operaciones se realizan de manera atómica. > Esto permite que otro hilo pueda ejecutar el código sincronizado.
  • 24. 24 Sun Educación México Espera y Notificación • Los métodos notify() y notifyAll() pueden ser usados como señal para mover los hilos en Espera al estado Listo para ejecutarse. • Todos estos métodos deben ser ejecutados en un código sincronizado, de otra forma se lanzara la excepción IlegalMonitorStateException. • La llamada al método notify() comunicara a solo un hilo y el método notifyAll() comunicara a todos los hilos que se encuentran en espera. No se puede determinar que hilo será ejecutado.
  • 25. 25 Sun Educación México Métodos Miscélaneos • boolean isAlive() > Este método puede ser usado para saber si un hilo esta vivo o muerto. Una aplicación de este método puede estar dada por la consulta de hilos hijos, antes de detener la ejecución de un hilo padre. • void join() throws InterruptedException > Este método invocado sobre un hilo, esperara y no retornara hasta que la ejecución del hilo concluya. El hilo padre esperara hasta que el hilo hijo concluya.

×