Il semble être impossible de faire une mise en cache du pool de threads avec une limite sur le nombre de threads qu'il peut créer.
Voici comment statique Exécuteurs testamentaires.newCachedThreadPool est mis en œuvre en Java standard de la bibliothèque:
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
Ainsi, l'utilisation de ce modèle pour créer un fixe mis en cache de taille du pool de threads:
new ThreadPoolExecutor(0, 3, 60L, TimeUnit.SECONDS, new SynchronusQueue<Runable>());
Maintenant, si vous utilisez ce et de soumettre des 3 tâches, tout ira bien. Soumettre d'autres tâches résultat sera rejeté l'exécution des exceptions.
Essayer ceci:
new ThreadPoolExecutor(0, 3, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue<Runable>());
Fera en sorte que tous les threads s'exécutant de manière séquentielle. I. e., le pool de threads ne fera jamais plus d'un thread pour gérer vos tâches.
C'est un bug dans la méthode execute de ThreadPoolExecutor? Ou peut-être que c'est intentionnel? Ou il y a une autre façon?
Edit: je veux quelque chose exactement comme la mise en cache du pool de threads (il crée des threads sur la demande, puis les tue après un certain délai d'attente), mais avec une limite sur le nombre de threads qu'il peut créer et la capacité de poursuivre la file d'attente des tâches supplémentaires une fois qu'il a atteint sa limite de thread. Selon sjlee la réponse, c'est impossible. En regardant la méthode execute() de ThreadPoolExecutor il est en effet impossible. J'aurais besoin d'une classe de ThreadPoolExecutor et remplacer execute() un peu comme SwingWorker fait, mais ce que SwingWorker n'est dans ses execute() est un hack.