9 votes

Quand créer un service exécuteur multiple par application java

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.

7voto

assylias Points 102015
  • 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.

1voto

Paul Sanwald Points 3762

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 :

  1. ThreadPoolExecutor
  2. ScheduledThreadPoolExecutor

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X