Работа Spring ThreadPoolTaskExecutor - PullRequest
3 голосов
/ 14 июля 2020

Я читал о том, как настройки Spring ThreadPoolTaskExecutor работают вместе и как работают пул потоков и очередь. Этот ответ stackoverflow, а также this и this article из Baeldung были мне полезны.

Насколько я понимаю, corePoolSize количество потоков постоянно поддерживается (при условии, что для параметра allowCoreThreadTimeOut не задано значение true). Если все эти потоки в настоящее время используются, любые дополнительные запросы будут помещены в очередь. После достижения queueCapacity размер пула потоков будет увеличиваться до достижения maxPoolSize.

Интуитивно я бы подумал, что вместо этого он будет работать следующим образом: corePoolSize число потоков постоянно поддерживается (опять же при условии, что для параметра allowCoreThreadTimeOut не задано значение true). Если все эти потоки в настоящее время используются и поступают новые запросы, размер пула будет увеличиваться до достижения maxPoolSize. Если поступит еще больше запросов, они будут помещены в очередь до тех пор, пока не будет достигнута queueCapacity.

Интересно, по какой причине он работает так, как есть?

1 Ответ

2 голосов
/ 14 июля 2020

Первое, что вам следует проверить, это документация.

Прямо из документации для ThreadPoolExecutor (ThreadPoolTaskExecutor - это просто оболочка):

ThreadPoolExecutor автоматически регулирует размер пула (см. GetPoolSize ()) в соответствии с границами, установленными в corePoolSize (см. GetCorePoolSize ()) и maximumPoolSize (см. GetMaximumPoolSize ()). Когда новая задача отправляется в методе execute (Runnable), если выполняется меньше потоков corePoolSize, создается новый поток для обработки запроса, даже если другие рабочие потоки простаивают. В противном случае, если выполняется меньше, чем maximumPoolSize потоков, будет создан новый поток для обработки запроса, только если очередь заполнена. [...]

Если в настоящее время в пуле больше потоков corePoolSize, избыточные потоки будут завершены, если они простаивали дольше keepAliveTime (см. GetKeepAliveTime (TimeUnit)). Это позволяет снизить потребление ресурсов, когда пул не используется активно. Если позже пул станет более активным, будут созданы новые потоки. [...]

(Вы не упомянули параметр для BlockingQueue, но я предлагаю вам также прочитать об этом. Это очень интересно.)

Почему параметры не работают так, как вы предложили?

Если размер пула будет увеличен до maximumPoolSize до постановки задач в очередь (как вы предложили), вы Была бы одна проблема: вы бы убрали возможность пула потоков определять , когда стоит новый воркер.

corePoolSize - это количество рабочих, которое пребывание в бассейне. Преимущество в том, что вам не нужно создавать, завершать, создавать, прекращать, создавать ... новых работников для данной рабочей нагрузки. Если вы можете определить, сколько работы будет всегда , разумно будет установить corePoolSize соответственно.

maximumPoolSize определяет максимальное количество воркеров в пуле. Вы хотите иметь контроль над этим, поскольку у вас может быть несколько пулов потоков, аппаратные ограничения или просто специальная c программа, в которой вам не нужно столько рабочих.

Теперь, почему рабочая очередь заполняется первый? Поскольку емкость очереди является показателем для , когда объем работы настолько велик, что стоит создавать новых рабочих. Пока очередь не заполнена, предполагается, что основных рабочих будет достаточно для выполнения данной работы. Если емкость достигнута, то создаются новые воркеры для дальнейшей работы.

С помощью этого механизма пул потоков динамически создает , когда в них есть необходимость, и сохраняет только определенное количество рабочих поскольку есть обычно потребность. Это точка пула потоков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...