Я хотел использовать собственный 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
Это должно произойти или я что-то упускаю?




Нет поддержки для запуска параллельного потока в настраиваемом пуле потоков. случается должен выполняться в другом пуле Fork / Join, когда операция инициируется в рабочем потоке другого пула Fork / Join, но это не похоже на запланированную функцию, поскольку код реализации Stream по-прежнему будет использовать артефакты тогда общий пул внутри некоторых операций.
В вашем случае кажется, что ExecutorService, возвращаемый MDCExecutors.newCachedThreadPool(), не является пулом Fork / Join, поэтому он вообще не демонстрирует этого недокументированного поведения.
Есть запрос функции JDK-8032512 относительно большего контроля потоков. Он открытый и, насколько я понимаю, без особой активности.
@Eugene, как сказано, случается работает таким образом (когда настраиваемый пул является пулом Fork / Join) в результате деталей реализации, а не запланированной функции. Сравните с этот ответ, где Стюарт Маркс явно заявляет, что этот трюк не гарантированно работает, а также описывает одну из проблем, которые я имел в виду, говоря, что «код реализации Stream по-прежнему будет использовать артефакты общего пула внутри».
это как-то влияет на меня (почти напрямую) довольно сильно, кажется. Я написал несколько мест, где я использую настраиваемый параллельный поток для запуска в отдельном ForkJoinPool, так как я не хочу, чтобы меня блокировали, если кто-то другой использует стандартный, кажется, что мне нужно пересмотреть код, но я могу быть из альтернатив. Спасибо за комментарий
меня сейчас очень смущает: | как насчет это? Или вы имеете в виду, что это имеет, чтобы быть еще одним
ForkJoinPool?