2010-11-05 7 views
1

J'ai un projet Java où j'ai besoin de faire fonctionner les choses en parallèle. Je fais cela avec des exécuteurs. La chose est, j'ai besoin d'utiliser des exécuteurs dans de nombreux endroits. Devrais-je favoriser le passage de quelques exécuteurs pour faire le travail (oublier de limiter le nombre global de threads pour un moment) ou est-il préférable de créer les exécuteurs là où j'en ai besoin?Dois-je limiter le nombre d'exécutants que j'ai?

Répondre

0

Il n'y a pas de règle stricte qui vous dira combien d'exécuteurs doivent être utilisés. Une chose, cependant peut être recommandée. Utilisez un mécanisme ou un cadre d'injection de dépendance pour injecter des implémentations d'exécuteur. Cela permettra un remplacement et une configuration rapides et faciles des exécuteurs utilisés.

+0

Ok. Actuellement, je fais quelque chose de similaire, mais à la main. Quand vous avez une structure d'objet plate, c'est bon. Si vous en avez un profond, je pense que vous préférez avoir un cadre pour vous, comme vous le suggérez. –

3

Ce à quoi vous devez vraiment penser est de contrôler le nombre de threads qui fonctionnent sur tous les Executors que vous créez.

Le nombre de threads que vous créez sur chaque exécuteur sera fonction de la fréquence d'arrivée et de la durée prévue (temps de traitement) de chaque tâche soumise. Avoir une file d'attente par type de tâche logique vous permet d'ajuster l'exécuteur pour cette tâche, de sorte que vous n'ayez pas plus de threads que nécessaire, et vous pouvez toujours suivre le débit de la tâche attendue.

Si vous avez un Executor monolithique partagé à travers toutes les étapes de traitement de votre application, il devient beaucoup plus difficile à régler.

SEDA est un modèle de concurrence typique qui reflète ce principe de file d'attente par étape de traitement.

Dans certains cas, il est logique d'avoir un exécuteur partagé, par exemple pour les tâches planifiées peu fréquentes, ad hoc ou de faible priorité.

+0

Mes tâches ne font rien la plupart du temps, donc il n'est pas nécessaire de limiter le nombre de threads "en cours" d'exécution, et il n'y a pas beaucoup d'exécution. Si les discussions avaient travaillé dur, cependant, je suis entièrement d'accord avec vous. –

+0

Peu importe s'ils effectuent beaucoup de traitement la plupart du temps, il reste à savoir si vous vous souciez ou non si un type de tâche dans l'application peut entraîner un retard dans l'adoption d'un autre type de tâche. À la fin de la journée, chaque exécuteur est lié à un ou plusieurs threads. Êtes-vous heureux que ceux-ci soient partagés entre différents types de tâches? – Joel

Questions connexes