62

私が投稿した質問に続いて、コードベースでThreadPoolExecutorを使用しようとしています。Java APIドキュメントから何度も理解しようとした後でもkeepAliveTime、コンストラクターに渡されるパラメーターの背後にある機能/目的を明確に理解できませんでした。誰かが私にいくつかの良い実例を説明してくれることを願っています。

Javaドキュメントからの抜粋:

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

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

4

3 に答える 3

96

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

ただし、それらがあまりにも早く殺されるのを避けるために、キープアライブ時間を指定できます。したがって、値として 1 を指定し、keepAliveTime値として 1 を指定TimeUnit.MINUTEしたunit場合、各スレッドは、タスクの実行が終了してから 1 分間待機して、さらに作業があるかどうかを確認します。それでもそれ以上の作業が与えられていない場合は、プールの「コア」であるプール内のスレッドが 5 つになるまで、それ自体を完了させます。

于 2012-04-30T06:22:12.267 に答える
6

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

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

于 2012-04-30T06:22:35.427 に答える