6.1 Objets exécutables

Nous sommes donc arrivés à la plus grande partie du package. Il décrira des interfaces pour exécuter des tâches asynchrones avec la possibilité d'obtenir des résultats via les interfaces Future et Callable, ainsi que des services et des usines pour créer des pools de threads : ThreadPoolExecutor, ScheduledPoolExecutor, ForkJoinPool.

Pour mieux comprendre, faisons une petite décomposition des interfaces et des classes.

6.2 Réalisations d'objets exécutables

Future<V>est une merveilleuse interface pour obtenir les résultats d'une opération asynchrone. La méthode clé ici est la méthode get, qui bloque le thread actuel (avec ou sans timeout) jusqu'à ce qu'une opération asynchrone sur un autre thread soit terminée. Il existe également des méthodes supplémentaires pour annuler l'opération et vérifier l'état actuel. La classe FutureTask est souvent utilisée comme implémentation.

RunnableFuture<V>- si Future est une interface pour l'API Client, alors l'interface RunnableFuture est déjà utilisée pour démarrer la partie asynchrone. L'exécution réussie de la méthode run() met fin à l'opération asynchrone et permet de récupérer les résultats via la méthode get.

Callable<V>- Un analogue étendu de l'interface Runnable pour les opérations asynchrones. Vous permet de renvoyer une valeur typée et de lever une exception vérifiée. Même si cette interface n'a pas de méthode run(), de nombreuses classes java.util.concurrent la prennent en charge avec Runnable.

FutureTask<V>— implémentation de l'interface Future/RunnableFuture. Une opération asynchrone est prise en entrée de l'un des constructeurs sous la forme d'objets Runnable ou Callable. La classe FutureTask elle-même est conçue pour être lancée dans un thread de travail, par exemple via new Thread(task).start() ou via ThreadPoolExecutor. Les résultats d'une opération asynchrone sont récupérés via la méthode get(...) .

Delayed- utilisé pour les tâches asynchrones qui devraient démarrer dans le futur, ainsi que dans DelayQueue. Permet de définir le délai avant le début d'une opération asynchrone.

ScheduledFuture<V>- une interface de marqueur qui combine les interfaces Future et Delayed.

RunnableScheduledFuture<V>- une interface qui combine RunnableFuture et ScheduledFuture. En outre, vous pouvez spécifier si la tâche est une tâche ponctuelle ou doit être exécutée à une fréquence spécifiée.