Подтвердить что ты не робот

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

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

Выдержки из документа Java:

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

Вот еще описание 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>
 *

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