Это то, что я обнаружил и в других местах. Забыл вернуться и обновить вопрос снова. Так что ответ принимается :)
ичок в лямбдах и асинхронном коде в 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
запустить, казалось бы, случайное количество раз?
РЕДАКТИРОВАТЬ: Просто хотел указать, что ситуация не совсем такая же, как в вопросе, который был отмечен как возможный дубликат, так как этот вопрос касался произвольно глубоко вложенных фьючерсов, и этот вопрос имеет дело с параллельными. Однако причина их неудачи практически идентична. Случаи кажутся достаточно различными, чтобы заслужить отдельные вопросы для меня, но другие могут не согласиться ...