| Introducción a la multitarea basada en hilos |
| Paso 1: Operativa |
Hay dos tipos distintos de multitarea
- basada en procesos
- es la característica que le permite a un
procesador ejecutar dos o más programas o procesos concurrentemente
- en este tipo de multitarea un proceso es la unidad de código más pequeña que el planificador de procesos puede
seleccionar
- por ejemplo puedes tener dos procesos ejecutándose concurrentemente en tu ordenador que te pueden permitir navegar por Internet mientras estás desarrollando una aplicación Java que se está ejecutando en la MVJ
- los procesos son tareas caras que necesitan
su propio espacio de direccionamiento
- la comunicación entre procesos también es cara y limitada
- trata con temas generales
- basada en hilos (threads)
- un proceso o programa puede realizar o ejecutar dos o más tareas o hilos a la vez
- en este tipo de multitarea el hilo es la unidad de código más pequeña
que un programa puede seleccionar
- los hilos son más ligeros que los procesos,
- ya que comparten el mismo espacio de direcciones y comparten
cooperativamente el mismo proceso pesado
- la comunicación entre hilos es ligera y
el cambio de contexto de un hilo al siguiente es menos costosa
- a diferencia de los procesos que tratan temas generales, los hilos gestionan los detalles
- la programación multihilo permite escribir
programas muy eficientes que utilizan al máximo la CPU
Diferencia conceptual entre un Servidor Web monohilo y un Servidor Web multihilo
Al comenzar la ejecución de un programa Java, la MVJ crea un flujo de ejecución llamado hilo principal del programa.
- un lenguaje que no soporte la multitarea basada en hilos,
- sólo tendrá un único flujo de ejecución
- un lenguaje que soporte la multitarea basada en hilos,
- el hilo principal del programa creará el resto de hilos del programa
Funcionamiento de un Servidor Web monohilo
- al comenzar la ejecución de un programa Java, la MVJ siempre crea un hilo que va fluyendo a través de toda la aplicación
- a este hilo se le llama hilo principal del programa
- en este caso, el hilo principal entra en un bucle
- como queremos que sea un Servidor Web que funcione las 24 horas del día, decimos que la condición del bucle siempre sea verdadera
- cuando el Navegador 1 realiza un impacto a nuestro Sitio Web el método escucharImpactosDeLosNavegadores()
- realiza una invocación síncrona al método enviarPáginaAlNavegador()
- lo que significa que el método escucharImpactosDeLosNavegadores() no volverá a tener el control hasta que no haya terminado de ejecutarse el método enviarPáginaAlNavegador()
Pseudocódigo de un Servidor Web Monohilo
Mientras (verdadero) {
escucharImpactosDeLosNavegadores();
// este método a su vez realiza una llamada síncrona al método enviarPaginaAlNavegador()
}
|
- Mientras (verdadero) {
- el hilo principal del programa entra en este bucle y se queda en él las 24 horas del día
- escucharImpactosDeLosNavegadores();
- este método es de tipo bloqueante
- es decir el hilo principal del programa al llegar a este método se queda bloqueado esperando ser invocado
- en este caso cuando un usuario de un Navegador realiza una petición (request) este método es invocado y se desbloquea
- entonces realiza una llamada síncrona al método enviarPaginaAlNavegador()
- enviarPaginaAlNavegador();
- como este método ha sido llamado de forma síncrona
- no retornará al flujo principal del programa hasta que no haya devuelto toda la página al Navegador que la ha solicitado.
- esto significa que no se volverá al principio del bucle y en definitiva al método escucharImpactosDeLosNavegadores() hasta que no haya terminado con su tarea
- y por tanto pueden haber otros usurarios que a través de sus Navegadores quieren visitar nuestro Sitio Web pero no los podemos atender porque el programa está ejecutando una tarea que todavía no ha finalizado
Funcionamieto de un Servidor Web multihilo

- cuando cualquier Navegador realiza un impacto a nuestro Sitio Web el método escucharImpactosDeLosNavegadores()
- realiza una invocación asíncrona al método enviarPáginaAlNavegador()
- lo que significa que el método escucharImpactosDeLosNavegadores() toma el control inmediatamente y puede seguir escuchando a posibles peticiones de otros Clientes
- cada vez que recibimos un impacto, el hilo principal del programa crea un nuevo hilo que se ejecuta de forma concurrente con los demás hilos con un camino de ejecución diferente
Pseudocódigo de un Servidor Web multihilo
Mientras (verdadero) {
escucharImpactosDeLosNavegadores();
//este método a su vez realiza una llamada asíncrona al método enviarPaginaAlNavegador()
}
|
- escucharImpactosDeLosNavegadores();
- este método es de tipo bloqueante
- en este caso cuando un usuario de un Navegador realiza una petición (request) este método es invocado y se desbloquea
- entonces realiza una llamada asíncrona al método enviarPaginaAlNavegador()
- enviarPaginaAlNavegador();
- como este método ha sido llamado de forma asíncrona
- se ejecutará paralelamente al hilo principal y no retornará al flujo principal del programa cuando haya terminado
- esto significa que el Servidor Web está respondiendo la petición de un cliente enviándole una página Web y también está esperando posibles nuevas peticiones de otros Navegadores