Задача очереди ParallelStream в CommonPool, а не в настраиваемом пуле

Я хотел использовать собственный ThreadPool для parallelStream. Причина в том, что я хотел использовать MDCContext в задаче. Это код, который я написал для использования настраиваемого ThreadPool:

final ExecutorService mdcPool = MDCExecutors.newCachedThreadPool();
mdcPool.submit(() -> ruleset.getOperationList().parallelStream().forEach(operation -> {
                log.info("Sample log line");
});

Когда контекст MDC не копировался в задачу, я смотрел журналы. Это журналы, которые я нашел. Первый журнал выполняется в «(pool-16-thread-1)», но другие задачи выполняются на «ForkJoinPool.commonPool-worker». Первый журнал также имеет MdcContextID. Но поскольку я использую настраиваемый ThreadPool для отправки задачи, все задачи должны выполняться в настраиваемом ThreadPool.

16 Oct 2018 12:46:58,298 [INFO] 8fcfa6ee-d141-11e8-b84a-7da6cd73aa0b (pool-16-thread-1) com.amazon.rss.activity.business.VariablesEvaluator: Sample log line
16 Oct 2018 12:46:58,298 [INFO]  (ForkJoinPool.commonPool-worker-11) com.amazon.rss.activity.business.VariablesEvaluator: Sample log line
16 Oct 2018 12:46:58,298 [INFO]  (ForkJoinPool.commonPool-worker-4) com.amazon.rss.activity.business.VariablesEvaluator: Sample log line
16 Oct 2018 12:46:58,298 [INFO]  (ForkJoinPool.commonPool-worker-13) com.amazon.rss.activity.business.VariablesEvaluator: Sample log line
16 Oct 2018 12:46:58,298 [INFO]  (ForkJoinPool.commonPool-worker-9) com.amazon.rss.activity.business.VariablesEvaluator: Sample log line
16 Oct 2018 12:46:58,299 [INFO]  (ForkJoinPool.commonPool-worker-2) com.amazon.rss.activity.business.VariablesEvaluator: Sample log line
16 Oct 2018 12:46:58,299 [INFO]  (ForkJoinPool.commonPool-worker-15) com.amazon.rss.activity.business.VariablesEvaluator: Sample log line

Это должно произойти или я что-то упускаю?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
0
329
1

Ответы 1

Нет поддержки для запуска параллельного потока в настраиваемом пуле потоков. случается должен выполняться в другом пуле Fork / Join, когда операция инициируется в рабочем потоке другого пула Fork / Join, но это не похоже на запланированную функцию, поскольку код реализации Stream по-прежнему будет использовать артефакты тогда общий пул внутри некоторых операций.

В вашем случае кажется, что ExecutorService, возвращаемый MDCExecutors.newCachedThreadPool(), не является пулом Fork / Join, поэтому он вообще не демонстрирует этого недокументированного поведения.

Есть запрос функции JDK-8032512 относительно большего контроля потоков. Он открытый и, насколько я понимаю, без особой активности.

меня сейчас очень смущает: | как насчет это? Или вы имеете в виду, что это имеет, чтобы быть еще одним ForkJoinPool?

Eugene 16.10.2018 17:14

@Eugene, как сказано, случается работает таким образом (когда настраиваемый пул является пулом Fork / Join) в результате деталей реализации, а не запланированной функции. Сравните с этот ответ, где Стюарт Маркс явно заявляет, что этот трюк не гарантированно работает, а также описывает одну из проблем, которые я имел в виду, говоря, что «код реализации Stream по-прежнему будет использовать артефакты общего пула внутри».

Holger 16.10.2018 17:20

это как-то влияет на меня (почти напрямую) довольно сильно, кажется. Я написал несколько мест, где я использую настраиваемый параллельный поток для запуска в отдельном ForkJoinPool, так как я не хочу, чтобы меня блокировали, если кто-то другой использует стандартный, кажется, что мне нужно пересмотреть код, но я могу быть из альтернатив. Спасибо за комментарий

Eugene 16.10.2018 17:25

Другие вопросы по теме