¿Por qué se debe utilizar ThreadPoolExecutor para crear un grupo de subprocesos?

En el lenguaje Java, la programación concurrente se basa en grupos de subprocesos y hay muchas formas de crear grupos de subprocesos, pero desde una perspectiva amplia, la creación de grupos de subprocesos se divide en dos categorías: usar ThreadPoolExecutor manualmente para crear grupos de subprocesos y usar ejecutores. para crear automáticamente grupos de subprocesos. Entonces, ¿qué método utilizar para crear un grupo de subprocesos?

Déjame hablar primero de la conclusión.

En el lenguaje Java, debe usar ThreadPoolExecutor para crear un grupo de subprocesos manualmente, porque este método puede controlar el número máximo de tareas y estrategias de rechazo a través de parámetros, lo que hace que la ejecución del grupo de subprocesos sea más transparente y controlable, y evita el riesgo de agotamiento de recursos. .

Presentación de riesgo OOM

Si usamos Executors para crear automáticamente grupos de subprocesos para crear grupos de subprocesos, habrá riesgo de desbordamiento de subprocesos. Tomemos CachedThreadPool como ejemplo para demostrar:
inserte la descripción de la imagen aquí

Paso 2 Establezca la memoria de ejecución máxima de la JVM en Idea en 10 M (este valor se establece principalmente para facilitar la demostración), como se muestra en la siguiente figura:
inserte la descripción de la imagen aquí

El resultado de la ejecución del programa anterior se muestra en la siguiente figura:

Se puede ver en los resultados anteriores que cuando el hilo se ejecuta 7 veces, comienza a aparecer la excepción de desbordamiento de memoria OutOfMemoryError.

Análisis de causas del desbordamiento de memoria.

Para comprender la causa del desbordamiento de memoria, debemos verificar los detalles de la implementación de CachedThreadPool. Su código fuente se muestra en la siguiente figura: el segundo
inserte la descripción de la imagen aquí
parámetro del constructor está establecido en Integer.MAX_VALUE, lo que significa el número máximo de subprocesos. , Debido a que CachedThreadPool no limita la cantidad de subprocesos, cuando la cantidad de tareas es particularmente grande, se crearán muchos subprocesos. En el ejemplo de OOM anterior, cada subproceso consume al menos 1 M de memoria, y la carga de clases del sistema JDK también ocupa parte de la memoria, por lo que cuando la memoria total en ejecución sea superior a 10 M, habrá un problema de desbordamiento de memoria.

Utilice ThreadPoolExecutor para mejorar

A continuación, usamos ThreadPoolExecutor para mejorar el problema OOM. Usamos ThreadPoolExecutor para crear manualmente un grupo de subprocesos, crear un grupo de subprocesos con un número máximo de subprocesos de 2, almacenar hasta 2 tareas y establecer la política de rechazo del grupo de subprocesos. Para ignorar la nueva tarea, de modo que el tamaño de la memoria en ejecución del grupo de subprocesos no exceda los 10 M, el código de implementación es el siguiente:
inserte la descripción de la imagen aquí

El resultado de la ejecución del programa anterior se muestra en la siguiente figura:
inserte la descripción de la imagen aquí

Se puede ver en los resultados anteriores que no hay ninguna excepción OOM en el grupo de subprocesos desde el principio hasta el final de la ejecución, lo cual es la ventaja de crear manualmente el grupo de subprocesos.

Otros problemas con la creación de grupos de subprocesos

Además del grupo de subprocesos CachedThreadPool, otras formas de utilizar Executors para crear automáticamente un grupo de subprocesos también tienen otros problemas. Por ejemplo, el código fuente de implementación de FixThreadPool es el siguiente:
inserte la descripción de la imagen aquí

De forma predeterminada, la capacidad de almacenamiento de la cola de tareas LinkedBlockingQueue es Integer.MAX_VALUE, que tiende a ser infinita, como se muestra en la siguiente figura:
inserte la descripción de la imagen aquí

Esto también provocará problemas de desbordamiento de memoria causados ​​por demasiadas tareas en el grupo de subprocesos. Este problema también existe en varias otras formas de utilizar Ejecutores para crear automáticamente grupos de subprocesos, por lo que no los demostraré uno por uno aquí.

Resumir

Los métodos de creación de grupos de subprocesos se dividen en dos categorías: uso manual de ThreadPoolExecutor para crear grupos de subprocesos y uso automático de Executors para crear grupos de subprocesos. Entre ellos, el uso de Ejecutores para crear subprocesos automáticamente, debido a que la cantidad de subprocesos o tareas es incontrolable, puede provocar un riesgo de desbordamiento de memoria, por lo que al crear un grupo de subprocesos, se recomienda utilizar ThreadPoolExecutor para crear.

Supongo que te gusta

Origin blog.csdn.net/qq_36256590/article/details/132382627
Recomendado
Clasificación