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

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

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-24 07:27:30625parcourir

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 exécution et en attente, 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 :

<code class="java">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();
    }
}</code>

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

<code class="java">if (!pool.awaitTermination(60, TimeUnit.SECONDS))</code>

par

<code class="java">while (!pool.awaitTermination(60, TimeUnit.SECONDS))</code>

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

Résumé de l'arrêt Méthodes

  • shutdown() : cesse 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.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn