Вопрос по multithreading, java – Как Keep-alive работает с ThreadPoolExecutor?

38

В продолжениевопрос опубликовано мной, я пытаюсь использоватьThreadPoolExecutor в моей кодовой базе. Даже после неоднократных попыток понять из API Java API, я не смог четко понять функциональность / цель позадиkeepAliveTime параметр для передачи в конструктор. Надеюсь, кто-нибудь сможет объяснить мне хороший рабочий пример.

Excerpts from Java doc:

<code>public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue)
</code>

keepAliveTime - when the number of threads is greater than the core, this is the maximum time that excess idle threads will wait for new tasks before terminating.

Да конечно. Спасибо, что поправили меня. Gnanam
Да, вы правы. Я просто имел в виду, что это новый вид реализации в моей кодовой базе. Gnanam
Но это не реализацияof ThreadPoolExecutor, Это действительно полезно, если вы можете использовать терминологию надлежащим образом -particularly Переполнение стека. Jon Skeet
Точно так же, как терминология, вы дважды использовали слово «реализовать». когда я думаю, что вы просто имеете в виду «использовать». Вы не пытаетесьimplement ThreadPoolExecutor написав свой собственный код, реализующий этот API - вы просто создаетеThreadPoolExecutor и вы хотите знать, как он будет себя вести, верно? Jon Skeet

Ваш Ответ

3   ответа
3

Вот еще немного описания из Javadoc:

<dt>Keep-alive times</dt>
 *
 * <dd>If the pool currently has more than corePoolSize threads,
 * excess threads will be terminated if they have been idle for more
 * than the keepAliveTime (see {@link
 * ThreadPoolExecutor#getKeepAliveTime}). This provides a means of
 * reducing resource consumption when the pool is not being actively
 * used. If the pool becomes more active later, new threads will be
 * constructed. This parameter can also be changed dynamically
 * using method {@link ThreadPoolExecutor#setKeepAliveTime}. Using
 * a value of <tt>Long.MAX_VALUE</tt> {@link TimeUnit#NANOSECONDS}
 * effectively disables idle threads from ever terminating prior
 * to shut down.
 * </dd>
 *

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

60

Предположим, у вас размер ядра 5, а максимальный размер 15. По какой-то причине ваш пул занят и использует все 15 доступных потоков. В конце концов у вас заканчивается работа, поэтому некоторые ваши потоки становятся бездействующими, когда они завершают свою последнюю задачу. Таким образом, 10 из этих потоков могут умереть.

Однако, чтобы избежать их быстрого уничтожения, вы можете указать время поддержки. Так что если вы указали 1 в качествеkeepAliveTime значение иTimeUnit.MINUTE какunit значение, каждый поток будет ждать одну минуту после того, как он завершит выполнение задачи, чтобы увидеть, есть ли еще работа. Если бы ему по-прежнему не давали больше работы, он позволил бы самому завершиться, пока в пуле не осталось только 5 потоков - "core". бассейна.

Error: User Rate Limit ExceedednecessarilyError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededkeepAliveTimeError: User Rate Limit ExceedednotError: User Rate Limit Exceeded Gnanam
0

Вот пример кода, который демонстрирует работуkeepAliveTime Как работает MaximumPoolSize ThreadPoolExecutor?

Похожие вопросы