Как Keep-alive работает с ThreadPoolExecutor?

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

выдержки из Java док:

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

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

3 ответов


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

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


вот еще несколько описаний из 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>
 *

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


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