2015-11-26 1 views
6

En Java 8, il existe deux façons de lancer des calculs asynchrones - CompletableFuture et ForkJoinTask. Ils semblent tous deux assez similaires - les classes internes de CompletableFuture même étendre ForkJoinTask.ForkJoinTask vs CompletableFuture

Y a-t-il une raison d'utiliser l'un sur l'autre?

une des principales différences que je peux voir est que la méthode CompletableFuture.join simplement des blocs jusqu'à ce que l'avenir est terminé (waitingGet juste spins en utilisant un ManagedBlocker), alors qu'un ForkJoinTask.join peut voler le travail de la file d'attente pour aider la tâche que vous joindre à compléter.

Y a-t-il un avantage par rapport à l'un ou l'autre?

Répondre

3

Ce sont deux choses différentes, ForkJoinTask est une tâche qui peut être soumis à un ForkJoinPool, CompletableFuture est une promesse qui peut fonctionner avec tous les Executor et l'exécuteur testamentaire n'a pas besoin d'être le ForkJoinPool,

Il est vrai cependant que le ForkJoinPool commun est la valeur par défaut si vous ne spécifiez pas, par ex:

CompletableFuture.supplyAsync(()-> supplier); 

utilise le ForkJoinPool si vous ne passez pas Executor. Il y a un autre overload qui prend un Executor.

CompletableFuture.supplyAsync(()-> supplier,executor); 

Async, qui est une classe static dans CompletableFuture étend ForkJoinTask<Void>, mais il n'a pas besoin d'être un ForkJoinTask, des docs de Async

/** La classe de base peut agir soit comme FJ ou plaine Runnable */

abstract static class Async extends ForkJoinTask<Void> 
    implements Runnable, AsynchronousCompletionTask 

Il peut aussi Runnable et un AsynchronousCompletionTask

Juste le remarque: ForkJoinTask, ForkJoinPool, ForkJoin... cours ont été ajoutés à 1,7 et non 1,8

+0

Je suppose que ma question est plus au sujet de quand vous utiliseriez un et pas l'autre (en supposant que vous utilisez le FJP commun par défaut). Lorsque vous rejoignez un CompletableFuture, est-ce que cela vous aide à compléter la tâche à laquelle vous vous joignez? – thecoop

+1

@thecoop Je ne vois pas comment vous pouvez remplacer l'un avec l'autre, CompletableFuture est une promesse qui a une opération comme thenApply et ensuiteCompose, maintenant si votre question est quand est-ce que j'utilise ForkJoinTask? Je dirais quand vous écrivez vos propres algorithmes parallèles –

1

Je dirais que le ForkJoinTask est plus recommandée lorsque vous avez une grande tâche et que vous voulez partager il doit fonctionner en parallèle dans plusieurs sous-tâches. Le framework ForkJoin utilise l'algorithme de vol de travail qui fera une utilisation efficace des threads. D'autre part, CompletableFutures sont plus appropriés pour un modèle de programmation réactif, où vous pouvez créer des pipelines d'exécution de manière synchrone ou asynchrone, et avoir un meilleur contrôle des threads en utilisant les pools de threads du service d'exécution.