Java création de thread frais généraux

Sagesse populaire nous dit que la haute-volume de java enterprise applications devraient utiliser le thread de mise en commun, de préférence à de nouvelles zones de frai de threads de travail. L'utilisation de java.util.concurrent fait de ce simple.

Il existe cependant des situations où la mise en pool de threads n'est pas un bon ajustement. L'exemple précis que je suis en train de lutte est l'utilisation de InheritableThreadLocal, qui permet ThreadLocal variables à "transmis" à tout donné naissance à des fils. Ce mécanisme de pauses lors de l'utilisation de pools de threads, depuis les threads de travail sont généralement pas disponible à partir de la demande de thread, mais sont pré-existants.

Maintenant, il ya des façons de contourner cela (le fil les habitants peuvent être explicitement passés), mais ce n'est pas toujours approprié ou pratique. La solution la plus simple consiste à engendrer de nouveaux threads de travail sur la demande, et de laisser InheritableThreadLocal faire son travail.

Cela nous ramène à la question - si j'ai un site à haut volume, où la demande de l'utilisateur, les threads sont hors frai une demi-douzaine de threads de travail de chacun (c'est à dire non à l'aide d'un pool de threads), est-ce que ça va donner à la JVM d'un problème? Nous sommes potentiellement parler d'un couple de centaines de nouveaux threads créés chaque seconde, chacune d'une durée inférieure à une seconde. Faire moderne Jvm optimiser ce bien? Je me souviens des jours où l'objet de mise en commun est souhaitable dans Java, parce que la création de l'objet était cher. Ceci est depuis devenu inutile. Je me demande si la même chose s'applique à la mise en pool de threads.

J'avais de référence, si je savais ce qu'il faut mesurer, mais ma crainte est que les problèmes peuvent être plus subtile que ne peut être mesurée avec un profiler.

Remarque: la sagesse de l'aide de fil habitants n'est pas la question ici, donc merci de ne pas me proposer de ne pas les utiliser.

  • J'allais suggérer que l'emballage de votre ThreadLocal dans une méthode d'accesseur serait probablement résoudre vos problèmes avec InheritableThreadLocal, mais vous ne semblez pas vouloir en entendre parler. De Plus, il semble que vous utilisez InheritableThreadLocal comme un out-of-band d'appel, qui, pour être honnête, apparaît comme une odeur de code.
  • Aussi loin que les pools de threads aller, le principal avantage est contrôle: vous savez que vous n'aurez pas tout à coup essayer de rotation de 10 000 threads dans une seconde.
  • Pour votre premier point, la ThreadLocals en question sont utilisés par les Printemps de la fève à la portée. C'est la façon dont des travaux du Printemps, et pas quelque chose que j'ai le contrôle. Pour votre deuxième point, la requête entrante threads sont limitées par tomcat pool de threads, de sorte que la limitation est inhérente à qui.
  • Comment le Tomcat pool de threads de limiter le nombre de threads que vous créez? Vous décrire une application où "la demande de l'utilisateur threads [frayer] une demi-douzaine de threads de travail," et j'ai pensé que votre préoccupation était sur ces fils. Un bug et vous pourriez facilement avoir plus de 10,000 fils filés pour une seule requête.
  • Concernant la raison pour laquelle vous avez besoin de ThreadLocal, cependant: il est valide, et une bonne chose à poster dans le message pour éviter les smart-ass commentaires 🙂
InformationsquelleAutor skaffman | 2010-01-22