Задача очереди ParallelStream в CommonPool, а не в пользовательском пуле - PullRequest
0 голосов
/ 16 октября 2018

Я хотел использовать пользовательский 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 Ответ

0 голосов
/ 16 октября 2018

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

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

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

...