Java 8 - l'Appel de méthodes asynchrones en parallèle et de combiner leurs résultats
Je suis nouveau sur le Java 8 simultanéité des fonctionnalités telles que CompletableFuture
et j'espère que vous pouvez aider à obtenir commencé avec la suite de cas d'utilisation.
Il ya un service appelé TimeConsumingServices
qui fournit beaucoup de temps à des opérations qui j'aimerais exécuter en parallèle puisque tous sont indépendants.
interface TimeConsumingService {
default String hello(String name) {
System.out.println(System.currentTimeMillis() + " > hello " + name);
return "Hello " + name;
}
default String planet(String name) {
System.out.println(System.currentTimeMillis() + " > planet " + name);
return "Planet: " + name;
}
default String echo(String name) {
System.out.println(System.currentTimeMillis() + " > echo " + name);
return name;
}
default byte[] convert(String hello, String planet, String echo) {
StringBuilder sb = new StringBuilder();
sb.append(hello);
sb.append(planet);
sb.append(echo);
return sb.toString().getBytes();
}
}
Jusqu'à présent j'ai mis en place l'exemple suivant et j'ai réussi à appeler les trois méthodes en parallèle.
public class Runner implements TimeConsumingService {
public static void main(String[] args) {
new Runner().doStuffAsync();
}
public void doStuffAsync() {
CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> this.hello("Friend"));
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> this.planet("Earth"));
CompletableFuture<String> future3 = CompletableFuture.supplyAsync(() -> this.echo("Where is my echo?"));
CompletableFuture.allOf(future1, future2, future3).join();
}
}
Est-il un moyen de collecter les valeurs de retour de chaque appel de service et appeler la méthode byte[]‘ convert(String, String, String)
?
Vous devez vous connecter pour publier un commentaire.
À combiner le résultat après avoir retourné tous vous pouvez faire quelque chose comme ceci
Cela permettra d'exécuter l'ensemble de vos contrats à terme, d'attendre qu'elles se terminent, puis dès qu'ils sont tous finis appelle votre
convert
méthode que vous mentionnez.Rejoindre après, vous pouvez simplement
get()
valeurs defuture1
comme:et ainsi de suite
future1.get(); future2.get(); future3.get();
ils ne sont pas appelés en parallèle, n'est-ce pas?TimeUnit.seconds(2).sleep()
; après la méthode de participation. Vous verrez queSystem.out.println
a été appelé avant que le sommeil.Future
s dans une Liste plutôt que comme des variables individuelles. Ensuite, vous pouvez faire une boucle à travers eux, à consommer les résultats.CompletableFuture
et de la traiter avec stream stackoverflow.com/questions/41392286/...Vous pouvez les combiner à l'aide de
thenCombine()
méthode si il y a seulement 3 contrat à remplir: