How to make parallel calls in Java with CompletableFuture example


Dev-Bookmarks Logo

Save up to a workweek a year by efficiently managing your dev bookmarks, on www.bookmarks.dev. Share your favorites with the community and they will be published on Github - Star


Some time ago I wrote how elegant and rapid is to make parallel calls in NodeJS with async-await and Promise.all capabilities. Well, it turns out in Java is just as elegant and succinct with the help of CompletableFuture which was introduced in Java 8. To demonstrate that let’s imagine that you need to retrieve a list of ToDos from a REST service, given their Ids. Of course you could iterate through the list of Ids and sequentially call the web service, but it’s much more performant to do it in parallel with asynchronous calls.

Here is the piece of code that might do just that:

import org.codingpedia.example;

import javax.inject.Inject;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.function.Supplier;
import java.util.stream.Collectors;

public class ParallelCallsDemoService {

    @Inject
    RestApiClient restApiClient;

    public List<ToDo> getToDos(List<String> ids){

        List<CompletableFuture<ToDo>> futures =
                ids.stream()
                          .map(id -> getToDoAsync(id))
                          .collect(Collectors.toList());

        List<ToDo> result =
                futures.stream()
                        .map(CompletableFuture::join)
                        .collect(Collectors.toList());

        return result;
    }


    CompletableFuture<ToDo> getToDoAsync(String id){

        CompletableFuture<ToDo> future = CompletableFuture.supplyAsync(new Supplier<ToDo>() {
            @Override
            public ToDo get() {
                final ToDo toDo = restApiClient.getToDo(id);

                return toDo;
            }
        });

        return future;
    }

}

Notes:

  • the supplyAsync method takes a Supplier which contains the code you want to execute asynchronously - in this case this is where the REST call takes place…
  • you fire all the rest calls and you collect all the futures in a list
  • in the end you collect all the results with the help of the join() method - this returns the value of the CompletableFuture when complete, or throws an (unchecked) exception if completed exceptionally.

Adrian Matei

Adrian Matei
Life force expressing itself as a coding capable human being

Discover a collection of more than 10k curated dev bookmarks

We have recently reached a second major milestone on www.bookmarks.dev. There are now more than 10k curated public dev bookmarks available. There are resources for programming languages like java, rust, go, python, for query language like sql, graphql to exotics like genetic-algorithms and astronomy Continue reading

New dev bookmarks in february 2019

Published on March 10, 2019