Clase Java ExecutorService
ExecutorService es una interfaz central en la programación concurrente de Java, que pertenece aljava.util.concurrentpaquete.
ExecutorService proporciona una forma más avanzada de gestión de hilos, lo que permite a los desarrolladores ejecutar tareas asíncronas de manera eficiente sin tener que crear y gestionar hilos manualmente.
Las funciones principales de ExecutorService incluyen:
- Gestión del grupo de hilos: gestiona automáticamente el ciclo de vida de los hilos, reduciendo el costo de creación y destrucción de hilos.
- Programación de tareas: admite el envío de
RunnableoCallabletareas y devuelveFutureun objeto para rastrear el estado de ejecución de la tarea. - Optimización de recursos: reutiliza hilos a través del grupo de hilos, mejorando el rendimiento del sistema.
Métodos principales de ExecutorService
ExecutorService ofrece múltiples métodos para enviar, gestionar y controlar la ejecución de tareas. A continuación se presentan algunos métodos clave:
submit()
Se utiliza para enviar una tarea (RunnableoCallable) y devolverFutureel objeto, para comprobar si la tarea se ha completado u obtener el valor de retorno.
Ejemplo
Future<?> future = executor.submit(() -> {
System.out.println("Task is running");
});
execute()
Solo se utiliza para enviarRunnabletareas, y no devuelve ningún resultado.
Ejemplo
System.out.println("Task executed");
});
shutdown()
Ejemplo
Ejemplo
shutdownNow()
Ejemplo
Ejemplo
awaitTermination()
Ejemplo
Ejemplo
Cómo crear ExecutorService
una clase de utilidad para crear diferentes tipos de grupos de hilos:ExecutorsCrea un grupo de hilos de tamaño fijo, adecuado para tareas con carga estable.
newFixedThreadPool(int nThreads)
Ejemplo
Ejemplo
newCachedThreadPool()
Ejemplo
Ejemplo
newSingleThreadExecutor()
Ejemplo
Ejemplo
newScheduledThreadPool(int corePoolSize)
Ejemplo
Ejemplo
Ejemplo de uso
Enviar tareas Runnable
Ejemplo
executor.submit(() -> {
System.out.println("Task 1 running");
});
executor.submit(() -> {
System.out.println("Task 2 running");
});
executor.shutdown();
Enviar tareas Callable y obtener el resultado
Ejemplo
Future<String> future = executor.submit(() -> {
Thread.sleep(1000);
return "Task completed";
});
try {
String result = future.get(); Mejores prácticas
System.out.println(result);
} catch (Exception e) {
e.printStackTrace();
}
executor.shutdown();
Mejores prácticas
Tareas intensivas en CPU::
- Tareas intensivas en E/S:
线程数 = CPU 核心数 + 1 - Evitar fugas de memoria
线程数 = CPU 核心数 * 2
- Tareas intensivas en E/S:
Asegúrate de llamar a:
- para cerrar el grupo de hilos.
shutdown()oshutdownNow()Manejo de excepciones
- para cerrar el grupo de hilos.
Utilice:
- para capturar las excepciones en las tareas, evitando que los hilos terminen inesperadamente.
try-catchUtilice
- para capturar las excepciones en las tareas, evitando que los hilos terminen inesperadamente.
para gestionar tareas.
FutureMediante:- se obtiene el resultado de la tarea o se comprueba su estado.
Future.get()Otras extensiones
- se obtiene el resultado de la tarea o se comprueba su estado.