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 deRunnableoCallabletareas 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

ExecutorService executor = Executors.newFixedThreadPool(2);
Future<?> future = executor.submit(() -> {
    System.out.println("Task is running");
});

execute()

Solo se utiliza para enviarRunnabletareas, y no devuelve ningún resultado.

Ejemplo

executor.execute(() -> {
    System.out.println("Task executed");
});

shutdown()

Ejemplo

Ejemplo

executor.shutdown();

shutdownNow()

Ejemplo

Ejemplo

List<Runnable> notExecutedTasks = executor.shutdownNow();

awaitTermination()

Ejemplo

Ejemplo

executor.awaitTermination(10, TimeUnit.SECONDS);

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

ExecutorService fixedThreadPool = Executors.newFixedThreadPool(4);

newCachedThreadPool()

Ejemplo

Ejemplo

ExecutorService cachedThreadPool = Executors.newCachedThreadPool();

newSingleThreadExecutor()

Ejemplo

Ejemplo

ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();

newScheduledThreadPool(int corePoolSize)

Ejemplo

Ejemplo

ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(2);

Ejemplo de uso

Enviar tareas Runnable

Ejemplo

ExecutorService executor = Executors.newFixedThreadPool(2);

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

ExecutorService executor = Executors.newFixedThreadPool(2);

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

  1. Tareas intensivas en CPU::

    • Tareas intensivas en E/S:线程数 = CPU 核心数 + 1
    • Evitar fugas de memoria线程数 = CPU 核心数 * 2
  2. Asegúrate de llamar a:

    • para cerrar el grupo de hilos.shutdown()oshutdownNow()Manejo de excepciones
  3. Utilice:

    • para capturar las excepciones en las tareas, evitando que los hilos terminen inesperadamente.try-catchUtilice
  4. para gestionar tareas.FutureMediante:

    • se obtiene el resultado de la tarea o se comprueba su estado.Future.get()Otras extensiones
AI pensando...