"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo cerrar correctamente los ejecutores de Java ExecutorService?

¿Cómo cerrar correctamente los ejecutores de Java ExecutorService?

Publicado el 2024-11-10
Navegar:513

How to Properly Shut Down Java ExecutorService Executors?

Cerrar correctamente Java ExecutorService

Los ejecutores son una forma conveniente de administrar y ejecutar tareas simultáneamente en aplicaciones Java. Sin embargo, un apagado inadecuado puede provocar comportamientos inesperados o problemas de rendimiento. Esta guía proporciona una explicación detallada de cómo cerrar correctamente un ExecutorService, asegurando que todas las tareas finalicen o cancelen.

Comprensión del cierre de ExecutorService

ExecutorService ofrece dos métodos de apagado principales :

  • shutdown(): evita que se envíen nuevas tareas y permite que se envíen tareas existentes. complete.
  • shutdownNow(): intenta detener todas las tareas en ejecución y en espera, devolviendo una lista de tareas no procesadas.

Es importante tener en cuenta que el apagado es No se garantiza que finalice todas las tareas. Las tareas que no responden a las interrupciones o que tienen operaciones de larga duración pueden permanecer activas.

Procedimiento de apagado recomendado

La documentación de Oracle sugiere el siguiente enfoque para un apagado ordenado:

void shutdownAndAwaitTermination(ExecutorService pool) {
    pool.shutdown();
    try {
        // Wait for existing tasks to terminate
        if (!pool.awaitTermination(60, TimeUnit.SECONDS)) {
            pool.shutdownNow();
            // Wait for tasks to respond to cancellation
            if (!pool.awaitTermination(60, TimeUnit.SECONDS))
                System.err.println("Pool did not terminate");
        }
    } catch (InterruptedException ie) {
        pool.shutdownNow();
        Thread.currentThread().interrupt();
    }
}

Este enfoque garantiza que las tareas existentes puedan finalizar y al mismo tiempo evita nuevos envíos. Si el proceso de apagado tarda más de lo esperado, puede reemplazar

if (!pool.awaitTermination(60, TimeUnit.SECONDS))

con

while (!pool.awaitTermination(60, TimeUnit.SECONDS))

para continuar esperando la tarea finalización.

Resumen de los métodos de apagado

  • shutdown(): deja de aceptar nuevas tareas pero permite que se completen las existentes.
  • shutdownNow(): detiene todas las tareas en ejecución y en espera y regresa sin procesar tareas.
  • awaitTermination(tiempo de espera prolongado, unidad TimeUnit): bloquea hasta que se completen todas las tareas, se agote el tiempo de espera o se interrumpa el hilo actual.
Declaración de liberación Este artículo se reproduce en: 1729725790 Si hay alguna infracción, comuníquese con [email protected] para eliminarla.
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3