2011-09-20 2 views
5

J'essaie de comprendre le point en spécifiant des tailles de noyau et de taille maximale séparées pour ThreadPoolExecutor de Java 5. Ma compréhension est que le nombre de threads est seulement augmenté une fois la file d'attente est pleine, ce qui semble un peu en retard (au moins avec des files d'attente plus grandes).Quand est-ce une bonne idée de spécifier des tailles de pool séparées et maximales dans ThreadPoolExecutor?

est-il pas que je suis soit heureux d'allouer un plus grand nombre de threads aux tâches, dans ce cas, je pourrais simplement augmenter la taille du pool de base; ou je ne suis pas vraiment disposé à le faire, auquel cas je devrais plutôt avoir une plus grande file d'attente? Qu'est-ce qu'un scénario où des tailles de noyau et de taille maximale distinctes sont utiles?

Répondre

2

La différence est que si vous êtes en dessous de la taille du pool de base, chaque nouvelle tâche crée un nouveau thread indépendamment des threads inactifs dans la piscine. Le nombre de threads n'est augmenté que lorsque la file d'attente est pleine lorsque vous avez déjà atteint la taille du pool principal mais que vous êtes toujours sous le maximum.

L'exemple parfait de cela est quand vous avez un système que vous ne savez pas exactement comment la charge beaucoup plus simultanée, il aura (par exemple un serveur web). Cette fonction vous permet de spécifier un ensemble de threads de base, peut-être basé sur le nombre de cœurs de votre machine, mais qui autorise plus de charge que prévu.

Cela est particulièrement utile si vous avez plus de charge d'E/S que prévu, et les fils dans votre piscine passer beaucoup de temps de blocage. Votre file d'attente peut facilement se remplir sans avoir une charge concurrente importante dans ce scénario, et elle est facilement réparée en ajoutant quelques nouveaux threads pour répondre à d'autres demandes simultanées.

+1

Mais alors je pourrais courir avec plus de fils pour commencer - sinon j'ajouter temps d'attente pour les tâches en attente dans la file d'attente. Je soupçonne également que dans de nombreux scénarios dans lesquels la file d'attente se remplit, elle pourrait se remplir rapidement, auquel cas les threads supplémentaires pourraient arriver trop tard. –

+0

@Peter, si votre analyse statique est assez bonne pour prédire le nombre correct de threads à utiliser en charge excessive et vous êtes heureux d'avoir ces threads supplémentaires assis autour de la charge normale alors allez-y! C'est un compromis entre le temps d'amorçage d'un fil en cours de chargement ou l'utilisation de ressources supplémentaires en cas de charge faible. – Bringer128

4

Il y a une discussion à ce sujet here.

La piscine est destinée à travailler sous une charge normale à corePoolSize (à dont il rampes jusqu'à moins est utilisé avant le démarrage). Lorsqu'une condition de surcharge se produit (définie par plus de tâches en attente/en cours que les travailleurs) nous utilisons la file d'attente pour agir comme un tampon - avec l'attente que la charge de travail normale sera restaurée dans le proche avenir. Si nous sommes préoccupés par une surcharge excessive, nous pouvons utiliser une file d'attente limitée de , et cela indique "si la file d'attente se remplit, ajoutez plus de travailleurs jusqu'à maxPoolSize". Si nous utilisons une file d'attente illimitée, nous disons que nous n'attendons pas (ou ne se soucient pas de) une surcharge excessive.

L'objectif est d'équilibrer la capacité de gérer la charge de travail attendue, même sous une surcharge temporaire, sans avoir trop fortes création et sans désabonnement trop de fil (c.-à- créer travail-die-créer).

+0

Le lien est mort? –

+1

C'est une excellente explication! Corrigé le lien mort. La discussion pointée dans la réponse peut être trouvée à http://comments.gmane.org/gmane.comp.java.jsr.166-concurrency/7109 – Shailendra

Questions connexes