2017-04-05 2 views
5

J'appelle une méthode client asynchrone en diffusant en continu une liste d'objets. La méthode renvoie Future. Quelle est la meilleure façon de parcourir la liste des contrats à terme retournés après l'appel (afin de traiter les futurs qui viennent en premier)?Le moyen le plus efficace de diffuser sur la liste des contrats à terme

Remarque: Le client asynchrone renvoie uniquement Future non CompletableFuture.

Voici le code:

List<Future<Object>> listOfFuture = objectsToProcess.parallelStream() 
    .map((object) -> { 
     /* calling an async client returning a Future<Object> */ }) 
    .collect(Collectors.toList()); 
+0

Avez-vous regarder dans un CompletionService plutôt que de cartographier les résultats à un tableau? http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CompletionService.html –

+0

Peut-être essayer [CompletionService] (http://docs.oracle.com/javase/7/docs/ api/java/util/concurrent/CompletionService.html)? Voici une [explication] (http://stackoverflow.com/a/19348417/6785649). –

+3

Le 'CompletionService' est tout à fait inutile si vous n'avez pas le contrôle sur le code qui produit le' Future'/soumet le travail à un 'Executor'. – Holger

Répondre

3

Ayant cette liste de List<Future<Object>>, je soumets à une piscine personnalisée, au lieu d'utiliser le traitement parallèle flux par défaut. En effet, l'api de flux utilise un pool commun pour le traitement parallèle et vous appelez get sur ces futurs (si le traitement prend beaucoup de temps). Vous bloquez toutes les autres opérations de flux qui utilisent des opérations parallèles dans votre application jusqu'à ce que celui-ci est fait.

Ce serait un peu comme ceci:

forJoinPool.submit(() -> list.stream().parallel().map(future -> future.get()).collect(Collectors.toList())).get(); 

Je voudrais aller avec une piscine personnalisée comme montré here