Исполнитель задачи пула потоков - PullRequest
2 голосов
/ 23 сентября 2019

Почему Spring ThreadPoolTaskExecutor продолжает создавать потоки до значения Core Size, независимо от того, существующие потоки простаивают!

    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    executor.setCorePoolSize(300);
    executor.setMaxPoolSize(500);
    executor.setQueueCapacity(5000);
    executor.setThreadNamePrefix("AsyncTask-");
    executor.initialize();

Я запускал запросы один за другим, и он продолжал увеличивать количество потоков, пока не достигло300. Мой вопрос: если существующий поток простаивает, почему он не использует свободный?Как только размер основного пула будет достигнут, он все равно будет использовать потоки только из пула.

enter image description here

Ответы [ 2 ]

2 голосов
/ 23 сентября 2019

Spring имеет здесь меньше возможностей согласно документации Java здесь

Когда новая задача отправляется в метод execute (Runnable) и выполняется меньше потоков corePoolSize,новый поток создается для обработки запроса, даже если другие рабочие потоки простаивают.Если запущено больше чем corePoolSize, но меньше чем MaximumPoolSize потоков, новый поток будет создан, только если очередь заполнена

1 голос
/ 23 сентября 2019

Размер пула основных потоков определяет количество потоков, которые должны быть готовы к выполнению любой потенциальной работы, чтобы избежать накладных расходов на создание новых потоков.При указании 300 запрашивается пул потоков, который постоянно поддерживает 300 потоков, поэтому не следует ожидать его повторного использования до того, как число будет достигнуто.Если оно слишком велико, рассмотрите возможность уменьшения corePoolSize при сохранении того же значения maxPoolSize, оно увеличивается при перегрузке пула.Проверьте ThreadPoolTaskExecutor's setAllowCoreThreadTimeOut , чтобы уменьшить пул потоков ниже corePoolSize, когда он не используется.

...