CachedThreadPoolは、実行時間の長いスレッドに使用してもマイナスの影響がないため、状況に応じて使用する必要があります。CachedThreadPoolsが短いタスクに適していることに関するJavaドキュメントのコメントは、それらがそのような場合に特に適切であることを示唆しているだけであり、実行時間の長いタスクを伴うタスクに使用できない、または使用すべきではないということではありません。
さらに詳しく説明すると、Executors.newCachedThreadPoolとExecutors.newFixedThreadPoolは両方とも、パラメーターが異なるだけで、同じスレッドプールの実装(少なくともオープンなJDKでは)によってサポートされています。違いは、スレッドの最小値、最大値、スレッドキル時間、およびキュータイプだけです。
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
FixedThreadPoolは、実際に固定数のスレッドを操作する場合に利点があります。これは、指定したレベルでスレッド数が維持されることを認識しながら、任意の数のタスクをエグゼキューターサービスに送信できるためです。スレッド数を明示的に増やしたい場合は、これは適切な選択ではありません。
ただし、これは、CachedThreadPoolで発生する可能性がある1つの問題が、同時に実行されるスレッドの数を制限することに関することを意味します。CachedThreadPoolはそれらを制限しません。そのため、あまり多くのスレッドを実行しないように、独自のコードを作成する必要がある場合があります。これは、実際にはアプリケーションの設計と、タスクがエグゼキューターサービスにどのように送信されるかに依存します。