J'ai un programme qui génère des threads (~ 5-150) qui effectuent un tas de tâches. À l'origine, j'ai utilisé un FixedThreadPool
parce que cette question similaire suggérait qu'ils étaient mieux adaptés pour des tâches plus longues et avec ma connaissance très limitée du multithreading, j'ai considéré la durée de vie moyenne des threads (plusieurs minutes) " longue durée ".
Cependant, j'ai récemment ajouté la possibilité de générer des threads supplémentaires et cela me fait dépasser la limite de thread que j'ai définie. Dans ce cas, serait-il préférable de deviner et d'augmenter le nombre de threads que je peux autoriser ou de passer à un CachedThreadPool
pour ne pas gaspiller de threads?
En les essayant tous les deux au préalable, il ne semble pas y avoir de différence, donc je suis enclin à aller avec le CachedThreadPool
juste pour éviter le gaspillage. Cependant, la durée de vie des threads signifie-t-elle que je devrais plutôt choisir un FixedThreadPool
et traiter uniquement les threads inutilisés? Cette question donne l'impression que ces fils supplémentaires ne sont pas gaspillés, mais j'apprécierais la clarification.
ThreadPoolExecutor
like bornéThreadPoolExecutor(0, maximumPoolSize, 60L, TimeUnit.SECONDS, SynchronousQueue())
?Les deux
FixedThreadPool
etCachedThreadPool
sont des maux dans les applications très chargées.CachedThreadPool
est plus dangereux queFixedThreadPool
Si votre application est très chargée et nécessite une faible latence, mieux vaut se débarrasser des deux options en raison des inconvénients ci-dessous
CachedThreadPool
une perte de contrôle lors de la création de threadsPuisque vous savez que les deux sont des maux, le moindre mal ne fait pas de bien. Préférez ThreadPoolExecutor , qui fournit un contrôle granulaire sur de nombreux paramètres.
beforeExecute(Thread, Runnable)
etafterExecute(Runnable, Throwable)
la source
Êtes-vous sûr de comprendre comment les threads sont réellement traités par votre système d'exploitation et le matériel de votre choix? Comment Java mappe les threads aux threads du système d'exploitation, comment cela mappe les threads aux threads CPU, etc.? Je demande parce que la création de 150 threads dans ONE JRE n'a de sens que si vous avez d'énormes cœurs / threads de processeur en dessous, ce qui n'est probablement pas le cas. Selon le système d'exploitation et la RAM utilisés, la création de plus de n threads peut même entraîner l'arrêt de votre JRE en raison d'erreurs de MOO. Vous devez donc vraiment faire la distinction entre les threads et le travail à faire par ces threads, combien de travail vous pouvez même traiter, etc.
Et c'est le problème avec CachedThreadPool: il n'a pas de sens de mettre en file d'attente un travail de longue durée dans des threads qui ne peuvent en fait pas s'exécuter car vous n'avez que 2 cœurs de processeur capables de traiter ces threads. Si vous vous retrouvez avec 150 threads planifiés, vous risquez de créer une surcharge inutile pour les planificateurs utilisés dans Java et le système d'exploitation pour les traiter simultanément. C'est tout simplement impossible si vous n'avez que 2 cœurs de processeur, à moins que vos threads n'attendent des E / S ou autre tout le temps. Mais même dans ce cas, beaucoup de threads créeraient beaucoup d'E / S ...
Et ce problème ne se produit pas avec FixedThreadPool, créé avec par exemple 2 + n threads, où n est raisonnablement bas bien sûr, car avec ce matériel et les ressources du système d'exploitation sont utilisés avec beaucoup moins de frais généraux pour gérer les threads qui ne peuvent pas fonctionner de toute façon.
la source