Это то, что я обнаружил и в других местах. Забыл вернуться и обновить вопрос снова. Так что ответ принимается :)

ичок в лямбдах и асинхронном коде в Java 8. Я продолжаю получать странные результаты ...

У меня есть следующий код:

import java.util.concurrent.CompletableFuture;

public class Program {

    public static void main(String[] args) {
        for (int i = 0; i < 100; i++) {
            String test = "Test_" + i;
            final int a = i;

            CompletableFuture<Boolean> cf = CompletableFuture.supplyAsync(() -> doPost(test));
            cf.thenRun(() -> System.out.println(a)) ;
        }
    }

    private static boolean doPost(String t) {
        System.out.println(t);

        return true;
    }
}

Фактический код намного длиннее, так какdoPost Метод отправит некоторые данные в веб-сервис. Тем не менее, я могу повторить мою проблему с этим голым кодом.

Я хочу иметьdoPost метод выполняется 100 раз, но асинхронно по соображениям производительности (для передачи данных в веб-службу быстрее, чем 100 синхронных вызовов).

В приведенном выше коде метод «doPost» запускается случайное количество раз, но всегда не более 20-25 раз. Нет никаких исключений. Кажется, что либо какой-то механизм обработки потоков молча отказывается создавать новые потоки и выполнять их код, либо потоки молча рушатся без сбоя программы.

У меня также есть проблема, где, если я добавлю больше функциональности кdoPost чем метод, показанный выше, он достигает точки, где метод просто молча ломается. Я пытался добавитьSystem.out.println("test") прямо перед оператором возврата в этом случае, но он никогда не вызывается. Цикл, который повторяется 100 раз, выполняет 100 итераций.

Такое поведение сбивает с толку, если не сказать больше.

Что мне не хватает? Почему функция предоставляется в качестве аргументаsupplyAsync запустить, казалось бы, случайное количество раз?

РЕДАКТИРОВАТЬ: Просто хотел указать, что ситуация не совсем такая же, как в вопросе, который был отмечен как возможный дубликат, так как этот вопрос касался произвольно глубоко вложенных фьючерсов, и этот вопрос имеет дело с параллельными. Однако причина их неудачи практически идентична. Случаи кажутся достаточно различными, чтобы заслужить отдельные вопросы для меня, но другие могут не согласиться ...

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

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