"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como desligar corretamente os executores Java ExecutorService?

Como desligar corretamente os executores Java ExecutorService?

Publicado em 2024-11-10
Navegar:475

How to Properly Shut Down Java ExecutorService Executors?

Desligando o Java ExecutorService

Os executores são uma maneira conveniente de gerenciar e executar tarefas simultaneamente em aplicativos Java. No entanto, o desligamento inadequado pode levar a problemas inesperados de comportamento ou desempenho. Este guia fornece uma explicação detalhada de como encerrar corretamente umExecutorService, garantindo que todas as tarefas sejam encerradas ou canceladas.

Compreendendo o desligamento do ExecutorService

ExecutorService oferece dois métodos principais de desligamento :

  • shutdown(): Impede que novas tarefas sejam enviadas enquanto permite que tarefas existentes sejam concluídas.
  • shutdownNow(): Tentativas para interromper todas as tarefas em execução e em espera, retornando uma lista de tarefas não processadas.

É importante observar que o encerramento não garante o encerramento de todas as tarefas. Tarefas que não respondem a interrupções ou têm operações de longa duração podem permanecer ativas.

Procedimento de desligamento recomendado

A documentação da Oracle sugere a seguinte abordagem para um desligamento normal:

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();
    }
}

Essa abordagem garante que as tarefas existentes possam ser concluídas, evitando novos envios. Se o processo de desligamento demorar mais do que o esperado, você pode substituir

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

com

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

para continuar aguardando a conclusão da tarefa.

Resumo dos métodos de desligamento

  • shutdown(): interrompe a aceitação de novas tarefas, mas permite que as tarefas existentes sejam concluídas.
  • shutdownNow(): interrompe todas as tarefas em execução e em espera, retornando tarefas não processadas .
  • awaitTermination(long timeout, unidade TimeUnit): Bloqueia até que todas as tarefas sejam concluídas, o tempo limite ocorra ou o thread atual seja interrompido.
Declaração de lançamento Este artigo foi reproduzido em: 1729725790 Se houver alguma violação, entre em contato com [email protected] para excluí-lo
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3