Получить доступ

В parallel stream выполняется обращение к внешнему HTTP-сервису. Почему это опасно для всего приложения?

MiddleМногопоточность
Коротко

Parallel stream выполняется в общем ForkJoinPool.commonPool — одном на JVM, размером «ядра − 1». Блокирующий HTTP-вызов занимает его потоки, и встают все parallel stream и async-стадии приложения, включая чужие библиотеки.

  • Сетевые вызовы — свой executor и CompletableFuture или виртуальные потоки
  • Отладить трудно: тормозит код, который не менялся
  • Запуск внутри своего ForkJoinPool — недокументированный трюк

А ещё Parallel stream — только для CPU-bound и больших объёмов

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Общий ForkJoinPool задумывался под короткие вычислительные задачи, которые никогда не блокируются. Стоит поместить туда сетевой вызов на секунду — и все остальные параллельные стримы приложения, включая чужие библиотеки, встают в очередь. Отладить это тяжело: тормозит код, который вы не меняли. Варианты решения: не использовать parallel stream для блокирующих операций вовсе; выполнить стрим внутри задачи, отправленной в собственный ForkJoinPool (известный обходной приём); либо взять ExecutorService или виртуальные потоки, которые для такой нагрузки подходят гораздо лучше. Общее правило: parallel stream — инструмент для CPU-bound обработки больших объёмов данных в памяти, и никак не для ввода-вывода.

Что хотят услышать

  • Общий пул и его размер.
  • Последствия блокировки.
  • Правильная альтернатива.

Частые ошибки

  • Добавлять .parallel() ради ускорения операций ввода-вывода.
  • Не учитывать, что общий пул разделяется со всем приложением.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Parallel stream по умолчанию использует общий ForkJoinPool.commonPool, и блокирующие задачи в нём тормозят все параллельные стримы приложения
  • ✗Parallel stream создаёт новый поток на каждый элемент
  • ✗HTTP-клиенты нельзя вызывать из нескольких потоков
  • ✗Ничего страшного: пул автоматически расширится под нагрузкой

Что спросят дальше

  • Как задать собственный пул для parallel stream?
  • Чему равен параллелизм общего пула по умолчанию?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем