El grupo de subprocesos es en realidad una implementación de la tecnología de agrupación. La idea central de la tecnología de agrupación es lograr la reutilización de recursos y evitar la sobrecarga de rendimiento causada por la creación y destrucción repetida de recursos. El grupo de subprocesos puede administrar un montón de subprocesos para que no se destruyan después de completar la tarea, sino que continúen procesando las tareas enviadas por otros subprocesos.
Beneficios de usar el grupo de subprocesos
Reducir el consumo de recursos. Reduzca el costo de creación y destrucción de subprocesos reutilizando los subprocesos creados.
Mejorar la velocidad de respuesta. Cuando llega una tarea, la tarea se puede ejecutar inmediatamente sin esperar a que se cree el hilo.
Mejorar la capacidad de gestión de subprocesos. Los subprocesos son recursos escasos. Si se crean sin restricciones, no solo consumirán recursos del sistema, sino que también reducirán la estabilidad del sistema. El grupo de subprocesos se puede utilizar para asignación, ajuste y monitoreo unificados.
Parámetros de construcción
corePoolSize: utilizado para trabajar en el grupo de subprocesosNúmero de hilos centrales。
tamañomáximodepool:Número máximo de hilos , el número máximo de subprocesos que puede crear el grupo de subprocesos. Cuando la cantidad de subprocesos en el grupo de subprocesos alcanza corePoolSize, si la cola de tareas está llena y es necesario procesar nuevas tareas, el grupo de subprocesos creará nuevos subprocesos (pero el número total no excede el máximoPoolSize) para procesar estas tareas. (Esto equivale a que cuando el área de la cola está llena, los subprocesos posteriores pueden saltar directamente a la cola.) Si el número de tareas excede el tamaño máximo de grupo y la cola de tareas está llena, el grupo de subprocesos procesará estas tareas no ejecutables de acuerdo con la política de rechazo.
keepAliveTime: el tiempo de supervivencia de los subprocesos creados después de exceder corePoolSize o todos los subprocesosTiempo máximo de supervivencia, dependiendo de la configuración.
unidad:keepAliveTime deunidad de tiempo。
cola de trabajo:cola de tareas , es una cola de bloqueo. Cuando el número de subprocesos alcanza el número de subprocesos principales, la tarea se almacenará en la cola de bloqueo. Implementaciones comunes: clases de implementación de la interfaz BlockingQueue, como ArrayBlockingQueue, LinkedBlockingQueue, etc.
threadFactory: utilizado para crear subprocesos dentro del grupo de subprocesosfábrica。
manipulador:Denegar política;Cuando la cola esté llena y el número de subprocesos alcance el número máximo de subprocesos, se llamará a este método para procesar la tarea.
Cómo configurar parámetros
1. Determine la cantidad de subprocesos principales (corePoolSize)
Tareas con uso intensivo de CPU: para tareas con uso intensivo de CPU, es común establecer el número de subprocesos centrales entre 1 y 2 veces el número de núcleos de CPU. Esto garantiza la utilización completa de los recursos de la CPU y evita cambios de contexto excesivos.
Tareas intensivas de IO: para tareas intensivas de IO, dado que los subprocesos no ocupan la CPU cuando esperan operaciones de IO, se pueden configurar más subprocesos centrales. En términos generales, la cantidad de subprocesos centrales se puede configurar en más de 2 veces la cantidad de núcleos de CPU para que se puedan procesar más tareas mientras se espera IO.
Tareas mixtas: si su aplicación contiene tareas con uso intensivo de CPU y de IO, debe equilibrar la configuración para la cantidad de subprocesos centrales según la situación específica.
2. Determine el número máximo de subprocesos (maximumPoolSize)
Entornos con recursos limitados: en entornos con recursos limitados (como sistemas integrados o servidores en la nube), es necesario limitar el número máximo de subprocesos para evitar que demasiados subprocesos ocupen recursos.
Sistema de alta concurrencia: para sistemas que necesitan manejar una gran cantidad de solicitudes simultáneas, la cantidad máxima de subprocesos se puede aumentar adecuadamente para mejorar las capacidades de procesamiento concurrente del sistema. Sin embargo, la configuración del número máximo de subprocesos debe considerarse de manera integral en función de la capacidad de carga y las condiciones de recursos del sistema.
3. Establecer el tiempo de inactividad del subproceso (keepAliveTime)
Aplicaciones con uso intensivo de CPU: para aplicaciones con uso intensivo de CPU, generalmente puede establecer el tiempo de inactividad del subproceso en un valor más corto porque los recursos de la CPU son muy valiosos y no desea que demasiados subprocesos inactivos ocupen recursos. En algunos casos, incluso se puede establecer en 0, lo que indica que los subprocesos no centrales no se retienen.
Aplicaciones con uso intensivo de IO: para aplicaciones con uso intensivo de IO, dado que los subprocesos no ocupan recursos de la CPU cuando esperan operaciones de IO, el tiempo de inactividad del subproceso se puede establecer en un valor más largo (como más de 1 minuto) para evitar el inicio y la destrucción frecuentes del subproceso. . la sobrecarga de rendimiento causada.
4. Seleccione la cola de tareas (workQueue)
cola limitada : El uso de una cola limitada puede limitar el tiempo de espera de las tareas en la cola y evitar el desbordamiento de la memoria debido a demasiadas tareas. Sin embargo, si la longitud de la cola es demasiado pequeña, es posible que se rechacen las tareas. (Generalmente elija cola limitada)
Cola ilimitada: el uso de una cola ilimitada puede almacenar en caché todas las tareas tanto como sea posible, pero debe prestar atención a los problemas de consumo de memoria. Si se utiliza una cola ilimitada, el parámetro de número máximo de subprocesos del grupo de subprocesos puede dejar de ser válido porque el grupo de subprocesos no intenta crear nuevos subprocesos para procesar tareas en la cola.
5. Configurar la fábrica de subprocesos (threadFactory)
La fábrica de hilos se utiliza para crear nuevos hilos. Al personalizar la fábrica de subprocesos, puede establecer atributos como la prioridad de los subprocesos y el estado del subproceso del demonio, y también puede establecer nombres significativos para los subprocesos para facilitar el diagnóstico de problemas en la JVM.
6. Configurar la política de rechazo (controlador)
Cuando el grupo de subprocesos no puede procesar nuevas tareas (es decir, el número de subprocesos ha alcanzado el tamaño máximo de grupo y la cola de tareas está llena), se debe configurar una política de rechazo para manejar estas tareas no ejecutables.Las estrategias de rechazo comunes incluyenLanzar una excepción directamente、Utilice el hilo de la persona que llama para ejecutar la tarea.、Ignorar nuevas tareas y descartar las tareas más antiguas de la cola esperar. También puede personalizar la política de rechazo según sea necesario.