"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Comment arrêter correctement les exécuteurs Java ExecutorService ?

Comment arrêter correctement les exécuteurs Java ExecutorService ?

Publié le 2024-11-10
Parcourir:863

How to Properly Shut Down Java ExecutorService Executors?

Arrêter gracieusement Java ExecutorService

Les exécuteurs sont un moyen pratique de gérer et d'exécuter des tâches simultanément dans les applications Java. Cependant, un arrêt incorrect peut entraîner un comportement inattendu ou des problèmes de performances. Ce guide fournit une explication détaillée sur la façon d'arrêter correctement un ExecutorService, garantissant que toutes les tâches sont terminées ou annulées.

Comprendre l'arrêt d'ExecutorService

ExecutorService propose deux méthodes d'arrêt principales. :

  • shutdown() : empêche la soumission de nouvelles tâches tout en permettant aux tâches existantes de se terminer.
  • shutdownNow() : tentatives pour arrêter toutes les tâches en cours d'exécution et en attente, en renvoyant une liste des tâches non traitées.

Il est important de noter que l'arrêt n'est pas garanti pour mettre fin à toutes les tâches. Les tâches qui ne répondent pas aux interruptions ou qui ont des opérations de longue durée peuvent rester actives.

Procédure d'arrêt recommandée

La documentation Oracle suggère l'approche suivante pour un arrêt progressif :

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

Cette approche garantit que les tâches existantes peuvent se terminer tout en empêchant les nouvelles soumissions. Si le processus d'arrêt prend plus de temps que prévu, vous pouvez remplacer

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

par

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

pour continuer à attendre la fin de la tâche.

Résumé des méthodes d'arrêt

  • shutdown() : arrête d'accepter de nouvelles tâches mais permet aux tâches existantes de se terminer.
  • shutdownNow() : arrête toutes les tâches en cours d'exécution et en attente, renvoyant les tâches non traitées .
  • awaitTermination(long timeout, TimeUnit unit) : bloque jusqu'à ce que toutes les tâches soient terminées, que le délai d'attente se produise ou que le thread en cours soit interrompu.
Déclaration de sortie Cet article est reproduit à l'adresse : 1729725790. En cas de violation, veuillez contacter [email protected] pour le supprimer.
Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3