ExecutorService.soumettre(Tâche) vs CompletableFuture.supplyAsync(Tâche, de l'Exécuteur testamentaire)
Pour exécuter certains trucs en parallèle ou de manière asynchrone, je peux utiliser un ExecutorService: <T> Future<T> submit(Runnable task, T result);
ou la CompletableFuture Api:static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier, Executor executor);
(Supposons que j'utilise dans les deux cas, la même Exécuteur)
Outre le type de retour Future
vs CompletableFuture
existe-il des différences remarquables. Ou Quand utiliser quoi?
Et quelles sont les différences si j'utilise le CompletableFuture
de l'API par défaut Executor
(la méthode sans exécuteur testamentaire)?
CompletableFuture
est plus récente, et a beaucoup plus de fonctionnalités avec un supérieur de l'API. Je vous recommande de l'utiliser chaque fois que possible. Future
brille par son absence.y at-il des faits? je ne veux pas de refactoriser le code car une api est tout "le plus récent" à mon humble avis, il pourrait être executorservices que le retour CompetableFuture.
Le problème fondamental avec
Future
est que vous avez à déchets de threads en attente pour eux de complet. CompletableFuture
retourne le script et a l'avenir invoquer des rappels quand il est fini. Vous n'avez pas besoin d'avoir un thread bloqué sur get()
.C'est seulement un problème si vous ne voulez pas attendre. Par exemple, avec Fork/Join le côté gauche du calcul doit attendre que le côté droit de compléter, avant de revenir.
Jean-pouvez-vous probablement faire de votre dernier commentaire une réponse, avec un petit exemple?
OriginalL'auteur dermoritz | 2016-09-13
Vous devez vous connecter pour publier un commentaire.
Est assez simple, vraiment. Vous utilisez le
Future
lorsque vous souhaitez que le thread qui s'exécute à attendre pour async calcul de la réponse. Un exemple de ceci est en parallèle avec une fusion/tri. Tri à gauche de manière asynchrone, de sorte à droite de façon synchrone, attendre sur la gauche pour compléter (future.get()
), fusionner les résultats.Vous utilisez un
CompleteableFuture
quand vous voulez un peu d'action, avec le résultat après l'achèvement, de manière asynchrone à partir d'exécution du thread. Par exemple: je veux faire un calcul de manière asynchrone et quand j'ai calculer, écrire les résultats dans un système. Le requérant fil peut ne pas besoin d'attendre sur un résultat, alors.Vous pouvez imiter l'exemple ci-dessus en un seul Avenir de l'exécutable, mais le
CompletableFuture
offre une interface fluide avec une meilleure gestion des erreurs.Cela dépend vraiment de ce que vous voulez faire.
Il va déléguer à
ForkJoin.commonPool()
qui est une taille par défaut pour le nombre de Processeurs sur votre système. Si vous faites quelque chose de IO intensif (lecture et de l'écriture dans le système de fichiers), vous devez définir le pool de threads différemment.Si c'est le CPU intensive, à l'aide de la commonPool a plus de sens.
Cette réponse n'est pas clairement pourquoi vous voulez
Future
, jamais. L'avantage deCompletableFuture
(async déclenchement des actions de suivi) est unique, mais il n'y a aucun avantage pourFuture
- la "attendre le résultat" est également applicable àCompletableFuture
.Aussi
ForkJoin.commonPool()
est partagée par l'ensemble de la JVM, le calcul destream
s, et d'autres tâches, sans fil la piscine mentionné.OriginalL'auteur John Vint
CompletableFuture a de riches fonctionnalités comme le chaînage de plusieurs contrats à terme, en combinant les contrats à terme, pour l'exécution de certaines mesures après l'avenir est exécutée (de manière synchrone ainsi que de manière asynchrone), etc.
Cependant, CompletableFuture n'est pas différent de l'Avenir en termes de performances. Même lorsque combiner plusieurs instances de CompletableFuture (à l'aide .thenCombine et .rejoignez à la fin), aucun d'entre eux sont exécutés à moins que nous demandons .la méthode get et pendant ce temps, l'invocation thread est bloqué. Je me sens en termes de performances, ce n'est pas mieux que de l'Avenir.
S'il vous plaît laissez-moi savoir si je suis absent de certains aspects de la performance ici.
OriginalL'auteur Chinmay Phadke
Ce clarifié pour moi la différence entre un complétées avenir un peu plus: La différence entre le Futur et le Promets
CompletableFuture est plus comme une promesse.
OriginalL'auteur dermoritz