Как получить следующее CompletableFuture из списка? - PullRequest
0 голосов
/ 13 октября 2019

Предположим, вы вынуждены реализовать этот интерфейс:

public void process(List<CompletableFuture<T>> futures);

Предположим, вы хотите дополнительно обрабатывать каждый элемент последовательно.

Что является наиболее эффективным способом с наименьшим количеством коданачать обработку каждого CompletableFuture<T> в текущем потоке, как только он завершится?

Это лучшее, что можно сделать? Это слишком многословно и не очень эффективно, и совсем не масштабируется:

ExecutorService pool = Executors.newFixedThreadPool(futures.size()); // yikes
CompletionService<T> queue = new ExecutorCompletionService<>(pool);
// pseudo-code: try-catch omitted for clarity
futures.forEach(future -> queue.submit(() -> future.get()));
for(int i=0; i < futures.size(); ++i) { 
    T item = queue.take();
    ... process ...
}
...