Перечислите последовательность от <Future> до Future <List>

Я пытаюсь конвертироватьList<CompletableFuture<X>> вCompletableFuture<List<T>>, Это очень полезно, когда у вас много асинхронных задач, и вам нужно получить результаты всех из них.

Если какой-либо из них терпит неудачу, тогда окончательное будущее терпит неудачу. Вот как я реализовал:

  public static <T> CompletableFuture<List<T>> sequence2(List<CompletableFuture<T>> com, ExecutorService exec) {
        if(com.isEmpty()){
            throw new IllegalArgumentException();
        }
        Stream<? extends CompletableFuture<T>> stream = com.stream();
        CompletableFuture<List<T>> init = CompletableFuture.completedFuture(new ArrayList<T>());
        return stream.reduce(init, (ls, fut) -> ls.thenComposeAsync(x -> fut.thenApplyAsync(y -> {
            x.add(y);
            return x;
        },exec),exec), (a, b) -> a.thenCombineAsync(b,(ls1,ls2)-> {
            ls1.addAll(ls2);
            return ls1;
        },exec));
    }

Чтобы запустить это:

ExecutorService executorService = Executors.newCachedThreadPool();
        Stream<CompletableFuture<Integer>> que = IntStream.range(0,100000).boxed().map(x -> CompletableFuture.supplyAsync(() -> {
            try {
                Thread.sleep((long) (Math.random() * 10));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return x;
        }, executorService));
CompletableFuture<List<Integer>> sequence = sequence2(que.collect(Collectors.toList()), executorService);

Если какой-либо из них терпит неудачу, то это терпит неудачу. Это дает результат, как и ожидалось, даже если есть миллион фьючерсов. У меня есть проблема: скажем, если есть более 5000 фьючерсов, и если любой из них не удается, я получаюStackOverflowError:

Исключение в потоке "pool-1-thread-2611" java.lang.StackOverflowError в java.util.concurrent.CompletableFuture.internalComplete (CompletableFuture.java:210) в java.util.concurrent.CompletableFuture $ ThenCompose.run (Complele). : 1487) в java.util.concurrent.CompletableFuture.postComplete (CompletableFuture.java:193) в java.util.concurrent.CompletableFuture.internalComplete (CompletableFuture.java:210) в java.util.concurrent.CompleFuture CompletableFuture.java:1487)

Что я делаю не так?

Примечание: вышеупомянутое возвращенное будущее терпит неудачу правильно, когда любое из будущего терпит неудачу Принятый ответ также должен принять это во внимание.

Ответы на вопрос(8)

Ваш ответ на вопрос