Il semble impossible de créer un pool de threads mis en cache avec une limite au nombre de threads qu'il peut créer.
Voici comment static Executors.newCachedThreadPool est implémenté dans la bibliothèque Java standard:
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
Donc, en utilisant ce modèle pour continuer à créer un pool de threads mis en cache de taille fixe:
new ThreadPoolExecutor(0, 3, 60L, TimeUnit.SECONDS, new SynchronusQueue<Runable>());
Maintenant, si vous utilisez ceci et soumettez 3 tâches, tout ira bien. La soumission de toute autre tâche entraînera le rejet d'exceptions d'exécution.
Essayer ceci:
new ThreadPoolExecutor(0, 3, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue<Runable>());
Cela entraînera l'exécution séquentielle de tous les threads. Par exemple, le pool de threads ne créera jamais plus d'un thread pour gérer vos tâches.
Il s'agit d'un bogue dans la méthode d'exécution de ThreadPoolExecutor? Ou peut-être que c'est intentionnel? Ou il y a un autre moyen?
Edit: Je veux quelque chose d'exactement comme le pool de threads mis en cache (il crée des threads à la demande, puis les tue après un certain délai) mais avec une limite sur le nombre de threads qu'il peut créer et la possibilité de continuer à mettre en file d'attente des tâches supplémentaires une fois qu'il a atteint sa limite de thread. Selon la réponse de sjlee, cela est impossible. En regardant la méthode execute () de ThreadPoolExecutor, c'est en effet impossible. J'aurais besoin de sous-classer ThreadPoolExecutor et de surcharger execute () un peu comme SwingWorker, mais ce que SwingWorker fait dans son execute () est un hack complet.