Автор показывает соблазн простого распараллеливания задач на Java через
Stream API и .parallel() вместо явных ExecutorService, Future, invokeAll и ручной обработки InterruptedException Однако такой подход использует
common ForkJoinPool, и его поведение не всегда предсказуемо, результаты могут отличаться между запусками, особенно при исключениях в задачах (
callsCounter может сильно варьироваться)Если в процессе одна из задач выбрасывает
Exception, выполнение остальных может продолжаться даже после возврата ошибки.
Параллельные стримы группируют задачи по частям коллекции, и минимальной единицей
может быть блок из нескольких элементов, это может привести к «неравномерной» нагрузке и даже ухудшению производительности по сравнению с ручным управлением через
ExecutorService. Блокирующие операции внутри задач могут полностью "забить"
common ForkJoinPool, что повлияет и на выполнение CompletableFuture.thenApplyAsync(), если вы не указали свой ExecutorЧитать подробнее<...>
👉 Java Portal
