SlideShare una empresa de Scribd logo
1 de 18
Descargar para leer sin conexión
Java Advanced Programming
Introduccion I
http://javacuriosities.blogspot.com.ar/
¿Que es un Proceso?
 Un proceso es un programa ejecutándose en forma independiente y con
un espacio propio de memoria.
 Un Sistema Operativo multitarea es capaz de ejecutar mas de un proceso
simultáneamente.
Java advanced programming
¿Que es un Thread?
 Un Thread es un hilo de ejecución dentro de un programa.
 La JVM es un sistema multi-threading. Es decir, es capaz de ejecutar
varias tareas simultáneamente dentro de un proceso.
Java advanced programming
Diferencias entre Proceso y Thread
 La diferencia básica entre un proceso de Sistema Operativo y un Thread
Java es que los threads corren dentro de la JVM, que es un proceso del
Sistema Operativo y por tanto comparten todos los recursos, incluida la
memoria y las variables y objetos allí definidos.
 Dado que los Threads se ejecutan dentro de un proceso comparten el
misma área de memoria.
 A este tipo de procesos donde se comparte los recursos a veces se les
llama ‘procesos ligeros’ (LWP - Lightweight Process).
Java advanced programming
Hyper-Threading
Cada programa puede tener uno (lo habitual) o más hilos de ejecución si
está bien diseñado. Cada uno de estos hilos de ejecución utiliza un núcleo
de procesador.
La idea detrás del Hyper-Threading es doblar la cantidad de hilos posibles.
 Un procesador 4 núcleos sin Hyper-Threading
- Puede ejecutar hasta 4 hilos.
 Un procesador 4 núcleos con Hyper-Threading
- Puede ejecutar hasta 8 hilos.
Conclusión:
Los núcleos son como bicicletas y los hilos son los ciclistas. Los
procesadores con Multi-Threading son como tándems, dos ciclistas
compartiendo bicicleta los cuales nunca serán tan eficientes como dos
bicicletas separadas.
Java advanced programming
1 Thread VS N Thread
Habiendo un solo Thread el procesador queda inactivo cuando el hilo esta
bloqueado ante diversos eventos.
La perdida de rendimiento puede ser de millones de ciclos de reloj
Java advanced programming
 Cuando un Thread esta sin utilizar el CPU se puede utilizar el nucleo para
que otro Thread se ejecute.
 El proceso de cambio entre threads se realiza mediante un cambio de
contexto.
Preemptivos VS No-Preemptivo
Sistemas Preemptivo (Expropiativo): Son los que permiten que un thread
de ejecución del núcleo sea sustituido por otro, además a cada tarea se le
asigna un tiempo del procesador (Esto se lo conoce como Quantum)
Sistemas No-Preemptivo: Cada thread se ejecuta hasta terminar su
ejecución o se cambia de thread porque este explícitamente permite el
cambio o realiza operaciones que dejan el procesador libre
Java advanced programming
Thread - Creacion
Java advanced programming
Existen dos formas de crear Threads en Java.
 Extender la clase Thread y sobrescribe el método run()
 Implementar la clase Runnable e implementar el método run()
Thread States
Java advanced programming
 New thread: Apenas es creado, es decir luego del llamado a new. Luego
al llamar al método start() pasa a estado ‘Runnable’.
 Runnable: Aquí el contexto de ejecución existe y el hilo puede ocupar la
CPU en cualquier momento. Este estado puede subdividirse en dos:
‘running’ y ‘in queue’. La transición entre estos dos estados es manejado
por el scheduler de la máquina virtual.
 Not Runnable: Cuando se invoca wait(), sleep(), join(), suspend(). El
Thread vuelve al estado ‘Runnable’ cuando el evento por que el que
espera ocurre.
 Dead: Cuando el Thread termina su ejecución (Finaliza el método run) o
es detenido por otro Thread llamando por su método stop(). La ultima
opción no es recomendada.
Ciclo de vida extendido
Java advanced programming
Metodo start() VS run()
Java advanced programming
Siempre que queramos ejecutar un Thread debemos llamar al método
start() ya que este se encarga de prepara los recursos del sistema y llamar
al método run().
Son métodos de instancia.
Metodo join()
Java advanced programming
El método join() sirve para detener el hilo actual hasta que finalice el hilo
sobre el cual ejecutamos el join().
Es un método de instancia.
Metodo yield()
Java advanced programming
El método yield es para ceder el procesador a otro hilo. Se debe usar en
código que realiza una tarea muy intensiva y que sabemos que va a ocupar
mucho CPU.
Método estático de la clase Thread.
Ejemplo: Dentro de un loop que va a consumir mucho tiempo podemos
cada 100 iteraciones (o el número que decidamos) llamar al metodo yield()
y en ese momento el scheduler va a poder darle la oportunidad a otros
procesos de usar el CPU, nuestro proceso cambia de estado ‘running’ a
‘runnable’ o sea genera una pausa en nuestro proceso.
Es importante aclarar que el metodo yield no garantiza que esto suceda y
capaz el hilo seleccionado es el mismo que estaba corriendo.
Metodo sleep()
Java advanced programming
El método sleep() provoca que el intérprete ponga al hilo en curso a dormir
durante el número de milisegundos que se indiquen en el parámetro de
invocación. Una vez transcurridos esos milisegundos, dicho hilo volverá a
estar disponible para su ejecución.
Los relojes asociados a la mayor parte de los intérpretes de Java no serán
capaces de obtener precisiones mayores de 10 milisegundos, por mucho
que se permita indicar hasta nanosegundos en la llamada alternativa a este
método.
Método estático de la clase Thread.
Metodo suspend()
Java advanced programming
El método suspend() es distinto de stop(). suspend() toma el hilo y provoca
que se detenga su ejecución sin destruir el hilo de sistema subyacente, ni
el estado del hilo anteriormente en ejecución. Si la ejecución de un hilo se
suspende, puede llamarse a resume() sobre el mismo hilo para lograr que
vuelva a ejecutarse de nuevo.
Se recomienda no usarlo ya que esta deprecado y puede generar
deadlocks.
Es un método de instancia.
Metodo resume()
Java advanced programming
El método resume() se utiliza para revivir un hilo suspendido. No hay
garantías de que el hilo comience a ejecutarse inmediatamente, ya que
puede haber un hilo de mayor prioridad en ejecución actualmente,
pero resume() ocasiona que el hilo vuelva a ser un candidato a ser
ejecutado.
Este se encuentra deprecado, ya que solo existe para trabajar con
suspend() el cual fue deprecado porque puede generar deadlocks.
Es un método de instancia.
Metodo stop()
Java advanced programming
Este método provoca que el hilo se detenga de manera inmediata. A
menudo constituye una manera brusca de detener un hilo, especialmente
si este método se ejecuta sobre el hilo en curso. En tal caso, la línea
inmediatamente posterior a la llamada al método stop() no llega a
ejecutarse jamás, pues el contexto del hilo muere antes de que stop()
devuelva el control. Una forma más elegante de detener un hilo es utilizar
alguna variable que ocasione que el método run() termine de manera
ordenada. En realidad, nunca se debería recurrir al uso de este método.
Se recomienda no usarlo ya que esta deprecado.
Es un método de instancia.
Errores tipicos
Java advanced programming
 Crear un Thread y llamar al método run() en lugar de llamar a start().
- El código se ejecutara de manera secuencial
 Llamar dos veces al método start() en el mismo Thread.
- Obtendremos la exception "java.lang.IllegalThreadStateException"
 Intentar reiniciar el Thread llamando al método start() ya sea porque el
Thread fue detenido usando stop() o porque este hubiera finalizado de
forma normal.
- Obtendremos la exception "java.lang.IllegalThreadStateException"

Más contenido relacionado

La actualidad más candente

La actualidad más candente (20)

Programación multihebra en java
Programación multihebra en javaProgramación multihebra en java
Programación multihebra en java
 
Programación III (Java) - 08 threads
Programación III (Java) - 08 threadsProgramación III (Java) - 08 threads
Programación III (Java) - 08 threads
 
Tema 12 hilos en java por gio
Tema 12   hilos en java por gioTema 12   hilos en java por gio
Tema 12 hilos en java por gio
 
2o departamental Programacion 3
2o departamental Programacion 32o departamental Programacion 3
2o departamental Programacion 3
 
GUIA 1 HILOS Y PROCESOS
GUIA 1 HILOS Y PROCESOSGUIA 1 HILOS Y PROCESOS
GUIA 1 HILOS Y PROCESOS
 
Máquina virtual en java
Máquina virtual en javaMáquina virtual en java
Máquina virtual en java
 
Thread group demonios- parte1
Thread group demonios- parte1Thread group demonios- parte1
Thread group demonios- parte1
 
Programando en java
Programando en javaProgramando en java
Programando en java
 
PCJ Sesión 9: Threads
PCJ Sesión 9: ThreadsPCJ Sesión 9: Threads
PCJ Sesión 9: Threads
 
Multitarea e hilos en java con ejemplos
Multitarea e hilos en java con ejemplosMultitarea e hilos en java con ejemplos
Multitarea e hilos en java con ejemplos
 
Chap 15cpin
Chap 15cpinChap 15cpin
Chap 15cpin
 
De Threads a CompletableFutures
De Threads a CompletableFuturesDe Threads a CompletableFutures
De Threads a CompletableFutures
 
Programación multitarea
Programación multitareaProgramación multitarea
Programación multitarea
 
Chap 15apin
Chap 15apinChap 15apin
Chap 15apin
 
Chap 15fpin
Chap 15fpinChap 15fpin
Chap 15fpin
 
Hilos
HilosHilos
Hilos
 
Lps 17 hilos
Lps 17 hilosLps 17 hilos
Lps 17 hilos
 
Chap 15bpin
Chap 15bpinChap 15bpin
Chap 15bpin
 
Uso de Excepciones en JAVA
Uso de Excepciones en JAVAUso de Excepciones en JAVA
Uso de Excepciones en JAVA
 
Curso de Sistemas Operativos - Unidad Procesos e Hilos
Curso de Sistemas Operativos - Unidad Procesos e HilosCurso de Sistemas Operativos - Unidad Procesos e Hilos
Curso de Sistemas Operativos - Unidad Procesos e Hilos
 

Similar a Java Threads (20)

Multitarea
MultitareaMultitarea
Multitarea
 
Tópicos Avanzados de Programación - Unidad 3 programacion concurrente
Tópicos Avanzados de Programación - Unidad 3 programacion concurrenteTópicos Avanzados de Programación - Unidad 3 programacion concurrente
Tópicos Avanzados de Programación - Unidad 3 programacion concurrente
 
DIAPOSITIVAS UNIDAD3.pdf
DIAPOSITIVAS UNIDAD3.pdfDIAPOSITIVAS UNIDAD3.pdf
DIAPOSITIVAS UNIDAD3.pdf
 
Topicos Avanzados de Programacion - Unidad 4 programacion concurrente
Topicos Avanzados de Programacion - Unidad 4 programacion concurrenteTopicos Avanzados de Programacion - Unidad 4 programacion concurrente
Topicos Avanzados de Programacion - Unidad 4 programacion concurrente
 
Hilos
HilosHilos
Hilos
 
Uso de threads en C#
Uso de threads en C#Uso de threads en C#
Uso de threads en C#
 
Subprocesamiento Mùltiple
Subprocesamiento MùltipleSubprocesamiento Mùltiple
Subprocesamiento Mùltiple
 
Clase9 threads
Clase9 threadsClase9 threads
Clase9 threads
 
Clase 3 ene 8
Clase 3 ene 8Clase 3 ene 8
Clase 3 ene 8
 
SCJP, Clase 9: Threads
SCJP, Clase 9: ThreadsSCJP, Clase 9: Threads
SCJP, Clase 9: Threads
 
Programación concurrente
Programación concurrenteProgramación concurrente
Programación concurrente
 
Sistemas operativos unidad 2
Sistemas operativos unidad 2Sistemas operativos unidad 2
Sistemas operativos unidad 2
 
Cuadro comparativo hilos
Cuadro comparativo hilosCuadro comparativo hilos
Cuadro comparativo hilos
 
Lab5 guia
Lab5 guiaLab5 guia
Lab5 guia
 
Implementación de hilos
Implementación de hilos Implementación de hilos
Implementación de hilos
 
Threads en java
Threads en javaThreads en java
Threads en java
 
Hilos java
Hilos javaHilos java
Hilos java
 
hilosJava.pptx
hilosJava.pptxhilosJava.pptx
hilosJava.pptx
 
Thread
ThreadThread
Thread
 
Threads.pdf
Threads.pdfThreads.pdf
Threads.pdf
 

Más de Luis Miguel De Bello (18)

Java Web Services - REST
Java Web Services - RESTJava Web Services - REST
Java Web Services - REST
 
Java Web Services - SOAP Temas Adicionales
Java Web Services - SOAP Temas AdicionalesJava Web Services - SOAP Temas Adicionales
Java Web Services - SOAP Temas Adicionales
 
Java Web Services - SOAP Binding
Java Web Services - SOAP BindingJava Web Services - SOAP Binding
Java Web Services - SOAP Binding
 
Java Web Services - Introduccion
Java Web Services - IntroduccionJava Web Services - Introduccion
Java Web Services - Introduccion
 
Java Web - JSF
Java Web - JSFJava Web - JSF
Java Web - JSF
 
Java Web - Struts
Java Web - StrutsJava Web - Struts
Java Web - Struts
 
Java Web - JSP
Java Web - JSPJava Web - JSP
Java Web - JSP
 
Java Web - Servlet
Java Web - ServletJava Web - Servlet
Java Web - Servlet
 
Base de datos - Clase 2
Base de datos - Clase 2Base de datos - Clase 2
Base de datos - Clase 2
 
Base de datos - Clase 3
Base de datos - Clase 3Base de datos - Clase 3
Base de datos - Clase 3
 
Base de datos - Clase 1
Base de datos - Clase 1Base de datos - Clase 1
Base de datos - Clase 1
 
Base de datos - Clase 4
Base de datos - Clase 4Base de datos - Clase 4
Base de datos - Clase 4
 
Java Web - Session
Java Web - SessionJava Web - Session
Java Web - Session
 
Java Web - Introduccion
Java Web - IntroduccionJava Web - Introduccion
Java Web - Introduccion
 
Sockets TCP
Sockets TCPSockets TCP
Sockets TCP
 
Sockets UDP
Sockets UDPSockets UDP
Sockets UDP
 
Log4J
Log4JLog4J
Log4J
 
Best Practices
Best PracticesBest Practices
Best Practices
 

Java Threads

  • 1. Java Advanced Programming Introduccion I http://javacuriosities.blogspot.com.ar/
  • 2. ¿Que es un Proceso?  Un proceso es un programa ejecutándose en forma independiente y con un espacio propio de memoria.  Un Sistema Operativo multitarea es capaz de ejecutar mas de un proceso simultáneamente. Java advanced programming
  • 3. ¿Que es un Thread?  Un Thread es un hilo de ejecución dentro de un programa.  La JVM es un sistema multi-threading. Es decir, es capaz de ejecutar varias tareas simultáneamente dentro de un proceso. Java advanced programming
  • 4. Diferencias entre Proceso y Thread  La diferencia básica entre un proceso de Sistema Operativo y un Thread Java es que los threads corren dentro de la JVM, que es un proceso del Sistema Operativo y por tanto comparten todos los recursos, incluida la memoria y las variables y objetos allí definidos.  Dado que los Threads se ejecutan dentro de un proceso comparten el misma área de memoria.  A este tipo de procesos donde se comparte los recursos a veces se les llama ‘procesos ligeros’ (LWP - Lightweight Process). Java advanced programming
  • 5. Hyper-Threading Cada programa puede tener uno (lo habitual) o más hilos de ejecución si está bien diseñado. Cada uno de estos hilos de ejecución utiliza un núcleo de procesador. La idea detrás del Hyper-Threading es doblar la cantidad de hilos posibles.  Un procesador 4 núcleos sin Hyper-Threading - Puede ejecutar hasta 4 hilos.  Un procesador 4 núcleos con Hyper-Threading - Puede ejecutar hasta 8 hilos. Conclusión: Los núcleos son como bicicletas y los hilos son los ciclistas. Los procesadores con Multi-Threading son como tándems, dos ciclistas compartiendo bicicleta los cuales nunca serán tan eficientes como dos bicicletas separadas. Java advanced programming
  • 6. 1 Thread VS N Thread Habiendo un solo Thread el procesador queda inactivo cuando el hilo esta bloqueado ante diversos eventos. La perdida de rendimiento puede ser de millones de ciclos de reloj Java advanced programming  Cuando un Thread esta sin utilizar el CPU se puede utilizar el nucleo para que otro Thread se ejecute.  El proceso de cambio entre threads se realiza mediante un cambio de contexto.
  • 7. Preemptivos VS No-Preemptivo Sistemas Preemptivo (Expropiativo): Son los que permiten que un thread de ejecución del núcleo sea sustituido por otro, además a cada tarea se le asigna un tiempo del procesador (Esto se lo conoce como Quantum) Sistemas No-Preemptivo: Cada thread se ejecuta hasta terminar su ejecución o se cambia de thread porque este explícitamente permite el cambio o realiza operaciones que dejan el procesador libre Java advanced programming
  • 8. Thread - Creacion Java advanced programming Existen dos formas de crear Threads en Java.  Extender la clase Thread y sobrescribe el método run()  Implementar la clase Runnable e implementar el método run()
  • 9. Thread States Java advanced programming  New thread: Apenas es creado, es decir luego del llamado a new. Luego al llamar al método start() pasa a estado ‘Runnable’.  Runnable: Aquí el contexto de ejecución existe y el hilo puede ocupar la CPU en cualquier momento. Este estado puede subdividirse en dos: ‘running’ y ‘in queue’. La transición entre estos dos estados es manejado por el scheduler de la máquina virtual.  Not Runnable: Cuando se invoca wait(), sleep(), join(), suspend(). El Thread vuelve al estado ‘Runnable’ cuando el evento por que el que espera ocurre.  Dead: Cuando el Thread termina su ejecución (Finaliza el método run) o es detenido por otro Thread llamando por su método stop(). La ultima opción no es recomendada.
  • 10. Ciclo de vida extendido Java advanced programming
  • 11. Metodo start() VS run() Java advanced programming Siempre que queramos ejecutar un Thread debemos llamar al método start() ya que este se encarga de prepara los recursos del sistema y llamar al método run(). Son métodos de instancia.
  • 12. Metodo join() Java advanced programming El método join() sirve para detener el hilo actual hasta que finalice el hilo sobre el cual ejecutamos el join(). Es un método de instancia.
  • 13. Metodo yield() Java advanced programming El método yield es para ceder el procesador a otro hilo. Se debe usar en código que realiza una tarea muy intensiva y que sabemos que va a ocupar mucho CPU. Método estático de la clase Thread. Ejemplo: Dentro de un loop que va a consumir mucho tiempo podemos cada 100 iteraciones (o el número que decidamos) llamar al metodo yield() y en ese momento el scheduler va a poder darle la oportunidad a otros procesos de usar el CPU, nuestro proceso cambia de estado ‘running’ a ‘runnable’ o sea genera una pausa en nuestro proceso. Es importante aclarar que el metodo yield no garantiza que esto suceda y capaz el hilo seleccionado es el mismo que estaba corriendo.
  • 14. Metodo sleep() Java advanced programming El método sleep() provoca que el intérprete ponga al hilo en curso a dormir durante el número de milisegundos que se indiquen en el parámetro de invocación. Una vez transcurridos esos milisegundos, dicho hilo volverá a estar disponible para su ejecución. Los relojes asociados a la mayor parte de los intérpretes de Java no serán capaces de obtener precisiones mayores de 10 milisegundos, por mucho que se permita indicar hasta nanosegundos en la llamada alternativa a este método. Método estático de la clase Thread.
  • 15. Metodo suspend() Java advanced programming El método suspend() es distinto de stop(). suspend() toma el hilo y provoca que se detenga su ejecución sin destruir el hilo de sistema subyacente, ni el estado del hilo anteriormente en ejecución. Si la ejecución de un hilo se suspende, puede llamarse a resume() sobre el mismo hilo para lograr que vuelva a ejecutarse de nuevo. Se recomienda no usarlo ya que esta deprecado y puede generar deadlocks. Es un método de instancia.
  • 16. Metodo resume() Java advanced programming El método resume() se utiliza para revivir un hilo suspendido. No hay garantías de que el hilo comience a ejecutarse inmediatamente, ya que puede haber un hilo de mayor prioridad en ejecución actualmente, pero resume() ocasiona que el hilo vuelva a ser un candidato a ser ejecutado. Este se encuentra deprecado, ya que solo existe para trabajar con suspend() el cual fue deprecado porque puede generar deadlocks. Es un método de instancia.
  • 17. Metodo stop() Java advanced programming Este método provoca que el hilo se detenga de manera inmediata. A menudo constituye una manera brusca de detener un hilo, especialmente si este método se ejecuta sobre el hilo en curso. En tal caso, la línea inmediatamente posterior a la llamada al método stop() no llega a ejecutarse jamás, pues el contexto del hilo muere antes de que stop() devuelva el control. Una forma más elegante de detener un hilo es utilizar alguna variable que ocasione que el método run() termine de manera ordenada. En realidad, nunca se debería recurrir al uso de este método. Se recomienda no usarlo ya que esta deprecado. Es un método de instancia.
  • 18. Errores tipicos Java advanced programming  Crear un Thread y llamar al método run() en lugar de llamar a start(). - El código se ejecutara de manera secuencial  Llamar dos veces al método start() en el mismo Thread. - Obtendremos la exception "java.lang.IllegalThreadStateException"  Intentar reiniciar el Thread llamando al método start() ya sea porque el Thread fue detenido usando stop() o porque este hubiera finalizado de forma normal. - Obtendremos la exception "java.lang.IllegalThreadStateException"