Quand est-ce une bonne idée de créer plus d'un service exécuteur par exécution d'un programme/application ? Pourquoi le faire, plutôt que de simplement démarrer executors.newcachedthreadpool()
au début et en y soumettant tous les appelants.
Réponses
Trop de publicités?- Vous pouvez avoir besoin de différentes variantes (par exemple un pool de threads fixes ou un exécuteur planifié).
- Encapsulation : si une classe spécifique doit exécuter des choses par le biais d'un exécuteur, il est logique que cette classe soit responsable de décider de sa politique d'exécution, ce qui est un détail de mise en œuvre.
- Spécialisation - corollaire du point précédent :
- certaines tâches nécessitent de nombreux threads (typiquement les tâches réseau)
- tandis que d'autres n'en ont besoin que de quelques unes (tâche liée au CPU)
- et certains ne devraient en utiliser qu'un seul (si vous lisez/écrivez sur votre disque dur local, par exemple).
- Il existe certainement des situations où vous voulez passer un exécuteur à un objet parce que vous voulez que le code appelant contrôle la façon dont certaines tâches seront exécutées.
En résumé, je ne vois pas pourquoi, pour un projet suffisamment important, vous voudriez utiliser un seul pool de threads pour l'ensemble de votre programme.
Un cas d'utilisation typique pour l'ajout d'un service exécuteur est lorsque vous voulez que votre service utilise une stratégie de pooling de threads différente ou qu'il ait deux tailles de pool différentes. Votre application peut contenir une classe d'exécutables que vous souhaitez soumettre à un pool de grande taille et de taille fixe, et un autre type d'exécutables pour lesquels vous souhaitez un pool plus petit.
Gardez à l'esprit que ExecutorService a plusieurs implémentations :
Jetez un coup d'œil aux paramètres du constructeur de ThreadPoolExecutor, ce sont toutes des choses que vous pouvez vouloir ajuster, en fonction du type de tâches que vous soumettez :
ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue)
Notez que vous pouvez également passer dans une file d'attente, de sorte que vous pouvez contrôler la stratégie de mise en file d'attente que votre pool de threads utilise.