Задача очереди 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
Это должно произойти или я что-то упустил?
1 ответ
Нет поддержки для запуска параллельного потока в пользовательском пуле потоков. Это происходит в другом пуле Fork/Join, когда операция инициируется в рабочем потоке другого пула Fork/Join, но это не похоже на запланированную функцию, поскольку код реализации Stream по-прежнему будет использовать артефакты общий пул внутри некоторых операций тогда.
В вашем случае кажется, что ExecutorService
вернулся MDCExecutors.newCachedThreadPool()
не является пулом Fork/Join, поэтому он вообще не демонстрирует такого недокументированного поведения.
Существует запрос функции, JDK-8032512, относительно большего контроля потока. Он открыт и, насколько я вижу, без особой активности.