A CachedThreadPool
semble approprié à votre situation car il n'y a pas de conséquence négative à l'utilisation d'un pool pour les threads longs. Le commentaire dans la documentation java sur les CachedThreadPools qui conviennent aux tâches courtes suggère simplement qu'ils sont particulièrement appropriés pour de tels cas, et non qu'ils ne peuvent pas être utilisés pour des tâches longues.
Le principal souci avec un CachedThreadPool
est qu'il créera jusqu'à Integer.MAX_VALUE
nombre de threads car il créera toujours un nouveau thread si un thread inutilisé n'existe pas dans le cache. Ainsi, si vous avez des tâches de longue durée, il est plus probable que vous puissiez augmenter le nombre de threads simultanés plus que vous ne le souhaitez puisque ce type de pool de threads ne limitera pas le nombre de threads exécutés simultanément. Cela ne semble pas être un problème pour votre cas d'utilisation tel que décrit, mais c'est quelque chose dont il faut être conscient.
Pour approfondir la différence entre un CachedThreadPool
et un FixedThreadPool
, Exécuteurs.newCachedThreadPool et Exécuteurs.newFixedThreadPool sont toutes deux soutenues par la même implémentation de pool de threads (au moins dans le JDK ouvert) via une instance de ThreadPoolExecutor
mais avec des paramètres différents. Les différences sont simplement le minimum et le maximum de threads, le temps de destruction des threads et le type de file d'attente.
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>());
}
A FixedThreadPool
a ses avantages lorsque vous souhaitez effectivement travailler avec un nombre fixe de threads, car vous pouvez alors soumettre n'importe quel nombre de tâches au service d'exécution tout en sachant que le nombre de threads sera maintenu au niveau que vous avez spécifié. Si vous souhaitez explicitement augmenter le nombre de threads, ce n'est pas le choix approprié.
Cela signifie cependant que le seul problème que vous pouvez avoir avec le CachedThreadPool
est de limiter le nombre de threads qui fonctionnent simultanément. Le site CachedThreadPool
ne les limitera pas pour vous, vous devrez donc écrire votre propre code pour vous assurer que vous n'exécutez pas trop de threads, ce que vous pouvez faire relativement facilement en instanciant votre propre ThreadPoolExecutor
avec les caractéristiques de comportement que vous souhaitez. Cela dépend vraiment de la conception de votre application et de la manière dont les tâches sont soumises au service d'exécution.