2

Dans le livre "Java 8 in action" (par Urma, Fusco et Mycroft), ils soulignent que les flux parallèles utilisent en interne le pool de jointure de fourche commun et que, bien que cela puisse être configuré globalement, par ex. using System.setProperty (...), qu'il n'est pas possible de spécifier une valeur pour un seul flux parallèle.Différence entre le flux parallèle et CompletableFuture

J'ai depuis vu le workaround qui implique l'exécution du flux parallèle à l'intérieur d'un ForkJoinPool personnalisé. Plus loin dans le livre, ils ont un chapitre entier consacré à CompletableFuture, durant lequel ils ont une étude de cas où ils comparent les performances respectives de l'utilisation d'un parallelStream VS un CompletableFuture. Il s'avère que leurs performances sont très similaires - ils mettent en évidence la raison pour laquelle ils sont tous deux par défaut en utilisant le même pool commun (et donc le même nombre de threads). Ils continuent à montrer une solution et soutiennent que le CompletableFuture est meilleur dans ce cas, car il peut être configuré pour utiliser un Executor personnalisé, avec une taille de pool de threads au choix de l'utilisateur. Lorsqu'ils mettent à jour la solution pour l'utiliser, les performances sont considérablement améliorées. Cela m'a fait penser - si l'on devait faire la même chose pour la version en flux parallèle en utilisant la solution de contournement mise en évidence ci-dessus, les performances seraient-elles similaires et les deux approches redeviendraient-elles similaires en termes de performances? Dans ce cas, pourquoi choisir le CompletableFuture sur le flux parallèle alors que cela demande plus de travail de la part du développeur.

Répondre

3

Dans ce cas, pourquoi choisir l'option CompletableFuture sur le flux parallèle alors que cela demande plus de travail de la part du développeur.

IMHO Cela dépend de l'interface que vous souhaitez prendre en charge. Si vous souhaitez prendre en charge une API asynchrone, par exemple

CompletableFuture<String> downloadHttp(URL url); 

Dans ce cas, seul un avenir est logique, car pouvant être complétée, vous voudrez peut-être faire quelque chose d'autre sans rapport pendant que vous attendez les données à venir vers le bas.

D'autre part, parallelStream() est le meilleur pour les tâches liées à la CPU où vous voulez que chaque tâche effectue une partie de certains travaux. c'est-à-dire que chaque thread fait la même chose avec des données différentes. Comme vous l'entendez, il est également plus facile à utiliser.