Maison >Java >javaDidacticiel >Présentation du service Executor en Java
Les API Executor et ExecutorService sont un outil crucial pour gérer et contrôler l'exécution des threads. Ils font partie du package java.util.concurrent. Ils simplifient le processus de programmation simultanée en éliminant les complexités de la création, de la gestion et de la synchronisation des threads.
Executors est une classe utilitaire du package java.util.concurrent qui fournit des méthodes d'usine pour créer et gérer différents types d'instances ExecutorService. Il simplifie le processus de création de pools de threads et nous permet de créer et de gérer facilement des instances d'exécuteur avec différentes configurations.
API Executor C'est une interface disponible depuis Java 1.5. Il fournit la méthode d'exécution (commande Runnable). Il s'agit de l'interface de base et ExecutorService étend cette interface. La commande donnée sera exécutée ultérieurement par un nouveau thread ou un thread du pool de threads ou du même thread et ne renvoie pas void.
API ExecutorService C'est une interface disponible depuis Java 1.5. Il fournit plusieurs méthodes pour contrôler l’exécution des tâches en programmation simultanée. Il prend en charge les tâches exécutables et appelables. Il renvoie Future pour le statut de la tâche. Vous trouverez ci-dessous les méthodes les plus fréquemment utilisées.
submit() accepte une tâche Callable ou Runnable et renvoie un résultat de type Future.
invokeAny() accepte un ensemble de tâches à exécuter et renvoie le résultat de l'exécution réussie d'une tâche.
invokeAll() accepte une collection de tâches à exécuter et renvoie le résultat de toutes les tâches sous la forme d'une liste d'objets de type Future.
shutdown() il n'arrête pas immédiatement le service exécuteur mais n'accepte pas de nouvelles tâches. Une fois toutes les tâches en cours terminées, le service exécuteur est arrêté.
shutdownNow() il essaie d'arrêter le service exécuteur immédiatement, mais il ne garantit pas que toutes les tâches en cours seront arrêtées en même temps.
awaitTermination (long timeout, unité TimeUnit) bloque/attend que toutes les tâches soient terminées, que le délai d'attente se produise ou que le thread en cours soit interrompu, selon la première éventualité. Le fil de discussion actuel sera bloqué.
Types de services d'exécution
ExecutorService fixedThreadPool = Executors.newScheduledThreadPool(5); Future<String> submit = fixedThreadPool.submit(() -> { System.out.println("Task executed by " + Thread.currentThread().getName()); return Thread.currentThread().getName(); }); fixedThreadPool.shutdown();
ExecutorService fixedThreadPool = Executors.newCachedThreadPool(); Future<String> submit = fixedThreadPool.submit(() -> { System.out.println("Task executed by " + Thread.currentThread().getName()); return Thread.currentThread().getName(); }); fixedThreadPool.shutdown();
ExecutorService fixedThreadPool = Executors.newSingleThreadExecutor(); Future<String> submit = fixedThreadPool.submit(() -> { System.out.println("Task executed by " + Thread.currentThread().getName()); return Thread.currentThread().getName(); }); fixedThreadPool.shutdown()
ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); // Single-threaded scheduler ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(5); // Multi-threaded scheduler
scheduler.schedule(task, 10, TimeUnit.SECONDS); // Schedule task to run after 10 seconds. scheduler.scheduleAtFixedRate(task, 5, 10, TimeUnit.SECONDS); //It schedules a task to run every 10 seconds with an initial delay of 5 seconds. scheduler.scheduleWithFixedDelay(task, 5, 10, TimeUnit.SECONDS); //It schedules a task to run with a fixed delay of 10 seconds between the end of one execution and the start of the next, with an initial delay of 5 seconds. scheduler.schedule(() -> scheduler.shutdown(), 20, TimeUnit.SECONDS); //It schedules a shutdown of the scheduler after 20 seconds to stop the example.
Soumission de tâches à ExecutorService
Les tâches peuvent être soumises à ExecutorService à l'aide des méthodesexecute() et submit(). La méthodeexecute() est utilisée pour les tâches Runnable, tandis que submit() peut gérer à la fois les tâches Runnable et Callable."
executor.execute(new RunnableTask()); //fire-and-forgot executor.submit(new CallableTask()); //returns the status of task
Arrêter ExecutorService
Il est important d'arrêter ExecutorService pour libérer des ressources. Vous pouvez le faire en utilisant les méthodes shutdown() et shutdownNow().
executor.shutdown(); // Initiates an orderly shutdown" executor.shutdownNow(); // Attempts to stop all actively executing tasks. executor.awaitTermination(long timeout, TimeUnit unit); //blocks the thread until all tasks are completed or timeout occurs or current thread is interrupted, whichever happens first. Returns `true `is tasks completed, otherwise `false`.
Approche recommandée pour l'arrêt
executor.shutdown(); try { // Wait for tasks to complete or timeout if (!executor.awaitTermination(120, TimeUnit.SECONDS)) { // If the timeout occurs, force shutdown executor.shutdownNow(); } } catch (InterruptedException ex) { executor.shutdownNow(); Thread.currentThread().interrupt(); }
À propos de Runnable
À propos de Callable
À propos de l'avenir
Bon codage et apprentissage !!!
Veuillez laisser un commentaire si vous avez des questions.
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!