2016-08-06 1 views
2

J'essaie de faire des appels parallèles à la méthode getPrice, pour chaque product en products. J'ai ce morceau de code et vérifié que getPrice s'exécute dans des threads séparés, mais ils s'exécutent séquentiellement, pas en parallèle. Quelqu'un peut-il me signaler ce qui me manque ici?Méthode d'appel en parallèle avec CompletablFuture et ExecutorService

Merci beaucoup pour votre aide.

ExecutorService service = Executors.newFixedThreadPool(THREAD_POOL_SIZE); 
    Set<Product> decoratedProductSet = products.stream() 
    .map(product -> CompletableFuture 
          .supplyAsync(() -> getPrice(product.getId(), date, context), service)) 
    .map(t -> t.exceptionally(throwable -> null)) 
    .map(t -> t.join()) 
    .collect(Collectors.<Product>toSet()); 

Répondre

4

Vous diffusez vos produits, envoyer chacun à un CompletableFuture mais attendez par join, avant que le flux traite le suivant.

Pourquoi ne pas utiliser:

products.parallelStream() 
.map(p -> getPrice(p.getId(), date, context)) 
.collect(Collectors.<Product>toSet()); 
+0

Je ne savais pas parallelStream, merci beaucoup! –