Programación Concurrente
Pool Thread
Versión 2.5
Crear threads es una operación más o menos
costosa con lo que reutilizándolos se aprovecha
mejor los recursos del sistema y en un número
grande de tareas a ejecutar la mejora en el
rendimiento quizá se note.
Desventajas: Thread
- Crear y destruir hilos tiene latencias
- Creación y control son responsabilidad del
programador
- El programador debe pensar en hilos en lugar de
concentrarse en las tareas
- Determinadas aplicaciones crean hilos de forma
masiva (web server) para las cuales el modelo de
threads es ineficiente
Pool Thread
- Es una reserva de hilos a la espera de recibir tareas
para ejecutarlas
- Sólo se crea una vez (reduce latencias)
- Reutiliza los hilos una y otra vez
- Efectúa de forma autómatica la gestión del ciclo de
vida de las tareas
- Recibe las tareas a ejecutar mediante objetos
Runnable
Crear un pool con un número fijo y limitado
de threads evita que el sistema se sature o
por el contrario esté infrautilizado,
configurando el tamaño
del pool de threads según las características
del sistema que las ejecutará y del tipo de
recursos que más utiliza las tareas se obtiene
el mejor rendimiento posible.
La interfaz [Link]
La ventaja de Executor sobre Thread, es una interfaz con múltiples
implementaciones que permiten controlar la ejecución del thread.
La variedad la aportan los objetos ExecutorService que se crean con la
fábrica (factory) de Executors.
Uno de los usos más habituales es limitar el número de threads
concurrentes, de forma que si el programa quiere lanzar más threads,
los nuevos se guardan en una cola hasta que termine uno de los
threads en ejecución.
La interfaz [Link]
import [Link];
public interface Executor{
public void execute (Runnable tarea);
}
Terminación ordenada. No se aceptan nuevos
void shutdown() threads, pero se espera a que terminen los que están
pendientes.
List<Runnable> Terminación forzada. Intenta parar los threads en
shutdownNow() ejecución, y devuelve los que quedan pendientes.
La interfaz [Link]
Son gestores de threads. Eso quiere decir que disponen de varios
objetos de tipo Thread que van utilizando “sabiamente” para ejecutar
las diferentes tareas que se le pasen para ejecutar.
La interfaz [Link]
Terminación ordenada. No se aceptan nuevos
void shutdown() threads, pero se espera a que terminen los que están
pendientes.
List<Runnable> Terminación forzada. Intenta parar los threads en
shutdownNow() ejecución, y devuelve los que quedan pendientes.
La clase Executors
Proporciona fábricas (factories) para generar diferentes tipos de
ExecutorService.
static ExecutorService Se crean nuevos threads según se necesitan; pero si un
newCachedThreadPool() thread termina, se recicla antes que crear uno nuevo.
static ExecutorService
Se utiliza hasta un máximo número de threads. Si hay más
newFixedThreadPool(int
solicitudes que threads, esperan a que termine alguno.
maximo)
static ExecutorService Utiliza un (1) thread. Si hay varias solicitudes, esperan a que
newSingleThreadExecutor() termine.
static
ScheduledExecutorService Se utiliza hasta un máximo número de threads. Si hay más
newScheduledThreadPool(int solicitudes que threads, esperan a que termine alguno.
maximo)
static
ScheduledExecutorService Utiliza un (1) thread. Si hay varias solicitudes, esperan a que
newSingleThreadScheduledExe termine.
cutor()
ExecutorService
La clase ExecutorService permite crear un pool de threads con un número
fijo de ellos, el pool reutilizará cada thread para ir ejecutando las tareas.
Runtime
Con el método
public int availableProcessors()
[Link]()
se obtiene el número de núcleos lógicos del ordenador de los
modernos procesadores que utilizan Hyper Threading tanto los de Intel
como AMD.
• si las tareas hacen un uso muy intensivo de CPU y poco de
entrada/salida el tamaño del pool de threads óptimo será cercano al
número de núcleos del procesador.
• si las tareas hacen un uso intensivo de entrada/salida el tamaño
del pool de threads óptimo será mayor ya que estarán la mayor
parte del tiempo esperando a que finalicen las lentas operaciones
de entrada y salida comparadas con la CPU.