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