2017-07-05 2 views
2

J'ai une liste de chaînes, et pour chacun d'eux, j'ai besoin d'ouvrir un nouveau sujet et de rassembler toutes les informations dans un CompletableFuture.Comment ouvrir et rassembler tous les résultats d'une liste dans des threads avec CompletableFuture?

Ceci est mon itération:

for (String result: results) { 
    candidateInfos.add(getCandidatesInfo(result)); 
} 

Je suis en train pour la première fois la mise en œuvre de fils et je vous serais reconnaissant de l'aide.

+0

Un [MCVE] est un bon début pour obtenir de l'aide – efekctive

Répondre

1

Vous pouvez générer Stream pour chaque appel de méthode et ensuite collecter le résultat dans une liste comme suit.

Stream.Builder<Supplier<CanditateInfo>> streamBuilder = Stream.builder(); 

results.forEach(string-> streamBuilder.accept(() -> this.getCandidatesInfo(string))); 

List<CanditateInfo> candidateInfos = streamBuilder.build().map(supplier -> CompletableFuture.supplyAsync(supplier, Executors.newFixedThreadPool(
    results.size()))).collect(Collectors.toList()).stream().map(
    CompletableFuture::join).collect(Collectors.toList()); 

Ici, j'ai utilisé le Exécuteur séparé car par défaut, java utilisez la fourche commune et rejoindre la piscine qui bloque tous les autres threads si la piscine aurait eu rempli. Pour plus d'informations voir http://fahdshariff.blogspot.in/2016/06/java-8-completablefuture-vs-parallel.html

+0

merci beaucoup, il fait la bonne chose! – ttdol2506