La sabiduría convencional nos dice que las aplicaciones Java empresariales de gran volumen deberían usar agrupamiento de subprocesos antes que engendrar nuevos subprocesos de trabajo. El uso de java.util.concurrent
lo hace sencillo.Sobrecarga de creación de subprocesos Java
Existen situaciones, sin embargo, donde la agrupación de subprocesos no es una buena opción. El ejemplo específico con el que estoy luchando actualmente es el uso de InheritableThreadLocal
, que permite que las variables ThreadLocal
se "transmitan" a cualquier subproceso generado. Este mecanismo se rompe cuando se utilizan grupos de subprocesos, ya que los subprocesos de trabajo generalmente no se generan a partir del subproceso de solicitud, sino que son preexistentes.
Ahora hay formas de evitar esto (los locales del hilo se pueden pasar explícitamente), pero esto no siempre es apropiado o práctico. La solución más simple es generar nuevos hilos de trabajo bajo demanda y dejar que InheritableThreadLocal
haga su trabajo.
Esto nos lleva de nuevo a la pregunta: si tengo un sitio de gran volumen, donde los hilos de solicitud de los usuarios están generando media docena de hilos de trabajo cada uno (es decir, no usan un grupo de subprocesos), ¿le dará una JVM? ¿problema? Estamos hablando potencialmente de un par de cientos de nuevos hilos que se crean cada segundo, cada uno dura menos de un segundo. ¿Las JVM modernas optimizan esto bien? Recuerdo los días en que la agrupación de objetos era deseable en Java, porque la creación de objetos era costosa. Esto se ha vuelto innecesario. Me pregunto si lo mismo se aplica a la agrupación de subprocesos.
Lo compararía, si supiera qué medir, pero mi temor es que los problemas sean más sutiles de lo que se puede medir con un generador de perfiles.
Nota: la sabiduría de utilizar locals hilo no es el problema aquí, así que no sugiero que no los use.
Iba a sugerir que envolver su ThreadLocal en un método de acceso probablemente resolvería sus problemas con InheritableThreadLocal, pero parece que no quiere escuchar eso. Además, parece que estás usando InheritableThreadLocal como un marco de llamada fuera de banda, que, para ser honesto, parece un olor a código. – kdgregory
En lo que respecta a las agrupaciones de subprocesos, el principal beneficio es el control: usted sabe que no tratará repentinamente de generar 10.000 subprocesos en un segundo. – kdgregory
@kdgregory: para su primer punto, las ThreadLocals en cuestión son utilizadas por Spring's bean scoping. Así es como funciona Spring, y no es algo sobre lo que yo tenga control. Para su segundo punto, los hilos de solicitud de entrada están limitados por el grupo de subprocesos de tomcat, por lo que la limitación es inherente a eso. – skaffman