Gruki Logo

Gruki - Documentación de Programación

Main

ExecutorService: Tu Jefe de Tareas en Java

Aprende qué es ExecutorService en Java, cómo usarlo para ejecutar tareas en paralelo y mejorar el rendimiento de tus programas. Explicaciones sencillas y ejemplos prácticos.

Imagina que tienes que limpiar tu habitación. Podrías hacerlo todo tú solo, pero tardarías mucho, ¿verdad? Ahora imagina que tienes varios amigos que te ayudan. ¡Terminarías mucho más rápido!

ExecutorService en Java es como un jefe que organiza el trabajo para tus amigos (los hilos). En lugar de que el programa principal haga todo el trabajo, ExecutorService reparte las tareas entre varios hilos, que trabajan en paralelo (al mismo tiempo). Esto hace que el programa termine mucho más rápido, especialmente si las tareas tardan un poco.

¿Por qué usar ExecutorService en lugar de crear hilos tú mismo?

Crear y manejar hilos directamente puede ser complicado y a veces puede causar problemas. Imagina que tienes que llamar a cada uno de tus amigos y explicarles qué hacer. Eso lleva tiempo y te puedes equivocar al dar las instrucciones.

ExecutorService se encarga de todos esos detalles complicados. Tú solo le dices qué tareas quieres realizar y él se encarga de encontrar hilos libres, asignarles las tareas y asegurarse de que todo funcione correctamente. ¡Es mucho más fácil y seguro!

Puntos importantes:

  • Reutilización de Hilos: ExecutorService reutiliza los hilos que ya ha creado, evitando la necesidad de crear nuevos hilos para cada tarea. Esto ahorra tiempo y recursos.
  • Control de Concurrencia: Te permite controlar cuántos hilos se ejecutan al mismo tiempo, evitando que tu programa consuma demasiados recursos y se vuelva lento.

Cómo usar ExecutorService: ¡Manos a la Obra!

Usar ExecutorService es muy sencillo. Primero, creas una instancia de un tipo específico de ExecutorService (como un `ThreadPoolExecutor`). Piensa en esto como elegir a tu equipo de amigos: ¿necesitas un equipo pequeño y rápido, o un equipo grande y constante?

Luego, le das las tareas al ExecutorService usando el método `submit()`. Cada tarea es como una instrucción que le das a un amigo: 'Lava los platos', 'Saca la basura', 'Ordena los juguetes'.

Finalmente, cuando hayas terminado de dar todas las tareas, debes cerrar el ExecutorService con `shutdown()`. Esto le dice al jefe que ya no hay más trabajo y que los hilos pueden terminar cuando hayan completado sus tareas.

Puntos importantes:

  • `submit()`: Este método recibe una tarea (un `Runnable` o `Callable`) y la entrega al ExecutorService para que la ejecute.
  • `shutdown()`: Este método detiene la aceptación de nuevas tareas, pero permite que las tareas que ya están en ejecución se completen.

Ejemplos de Código

Un ejemplo sencillo de cómo usar ExecutorService para ejecutar dos tareas simples en paralelo.

Lenguaje: Java
java

Explicación del código:

  1. Línea 1: `import java.util.concurrent.ExecutorService;`: Importa la interfaz `ExecutorService`, que define los métodos para gestionar hilos.
  2. Línea 2: `import java.util.concurrent.Executors;`: Importa la clase `Executors`, que proporciona métodos para crear diferentes tipos de `ExecutorService`.
  3. Línea 3: `public class EjemploExecutorService { ... }`: Define una clase llamada `EjemploExecutorService` que contiene el programa principal.
  4. Línea 4: `public static void main(String[] args) { ... }`: El método principal donde se ejecuta el programa.
  5. Línea 5: `ExecutorService executor = Executors.newFixedThreadPool(2);`: Crea un `ExecutorService` llamado `executor` que tiene un número fijo de 2 hilos. Piensa en esto como contratar a dos amigos para ayudarte con la limpieza.
  6. Línea 6: `Runnable tarea1 = () -> { ... };`: Define una tarea (tarea1) usando una expresión lambda. Esta tarea imprime 'Tarea 1: Empezando...', espera 2 segundos, e imprime 'Tarea 1: Terminando...'. Piensa en esto como una instrucción para uno de tus amigos: 'Lava los platos, pero tómate tu tiempo'.
  7. Línea 7: `Thread.sleep(2000);`: Hace que el hilo actual se detenga durante 2000 milisegundos (2 segundos). Esto simula un trabajo que tarda en completarse.
  8. Línea 8: `Runnable tarea2 = () -> { ... };`: Define otra tarea (tarea2) similar a la tarea1, pero esta tarea espera solo 1 segundo. Piensa en esto como otra instrucción para tu otro amigo: 'Saca la basura, pero hazlo rápido'.
  9. Línea 9: `executor.submit(tarea1);`: Envía la tarea1 al `ExecutorService` para que la ejecute. El `ExecutorService` asignará esta tarea a uno de los hilos disponibles.
  10. Línea 10: `executor.submit(tarea2);`: Envía la tarea2 al `ExecutorService` de manera similar.
  11. Línea 11: `executor.shutdown();`: Cierra el `ExecutorService`. Esto significa que no aceptará más tareas nuevas, pero esperará a que las tareas que ya están en ejecución se completen. Piensa en esto como decirles a tus amigos que ya no hay más trabajo, pero que terminen lo que ya están haciendo.

Recursos relacionados

Explora más contenido relacionado con Introducción a ExecutorService. para profundizar tus conocimientos.