El documento describe las diferencias entre procesos y hilos en Java. Un proceso es un programa que se ejecuta de forma independiente con su propia memoria, mientras que un hilo es una secuencia de ejecución dentro de un proceso. La JVM permite ejecutar múltiples hilos simultáneamente dentro de un solo proceso, compartiendo los recursos como la memoria. Se explican conceptos como la creación de hilos, sus estados de vida, y métodos como start(), join(), yield(), sleep() y stop(). Finalmente, se mencionan algunos errores comunes rel
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.
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"