web-dev-qa-db-ja.com

Keep-aliveはThreadPoolExecutorでどのように機能しますか?

私が投稿した question に続き、コードベースで ThreadPoolExecutor を使用しようとしています。 Java API docから理解しようと繰り返し試みた後でも、コンストラクターに渡されるkeepAliveTimeパラメーターの背後にある機能/目的を明確に理解できませんでした。いくつかの良い動作例。

Java doc:からの抜粋

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

keepAliveTime-スレッド数がコアより大きい場合、これは過剰なアイドルスレッドが終了する前に新しいタスクを待機する最大時間です。

40
Gnanam

コアサイズが5、最大サイズが15であるとします。何らかの理由で、プールがビジーになり、使用可能な15のスレッドすべてを使用します。最終的にあなたはやるべき仕事を使い果たします-そのため、スレッドのいくつかは最終タスクを終えるとアイドルになります。したがって、これらのスレッドのうち10個が死ぬことが許可されています。

ただし、それらが急速に削除されるのを防ぐために、キープアライブ時間を指定できます。したがって、keepAliveTime値として1を指定し、TimeUnit.MINUTEunit値として、各スレッドがタスクの実行を完了してから1分間待って、さらに作業が必要かどうかを確認します。まだそれ以上の作業が与えられていない場合、プール内にスレッドが5つ(プールの「コア」)になるまで、それ自体が完了します。

66
Jon Skeet

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>
 *

基本的に、これにより、アイドルプールに残されるスレッドの数を制御できます。これを小さくしすぎると(実行していることに対して)、作成するスレッドが多すぎます。大きくしすぎると、必要のないメモリ/スレッドを消費することになります。

4
Francis Upton

次に、keepAliveTimeの動作を示すコードの例を示します ThreadPoolExecutorのmaximumPoolSizeはどのように機能しますか?

0
Dmitry Krivenko