Предположим, вы вынуждены реализовать этот интерфейс:
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 ...
}