Red de conocimientos turísticos - Conocimientos sobre calendario chino - 15. Grupo de subprocesos (6) Desventajas de crear grupos de subprocesos automáticamente

15. Grupo de subprocesos (6) Desventajas de crear grupos de subprocesos automáticamente

La llamada creación automática de un grupo de subprocesos consiste en llamar directamente a varios métodos de Ejecutores para generar un grupo de subprocesos público, como Executors.newCachedThreadPool (). Pero existen ciertos riesgos al hacerlo, así que analicemos los problemas causados ​​​​por la creación automática de un grupo de subprocesos.

Primero, echemos un vistazo al primer tipo de grupo de subprocesos, el grupo de subprocesos fijos (FixedThreadPool), que es un grupo de subprocesos con un número fijo de subprocesos. Como se muestra en el código fuente, newFixedThreadPool en realidad llama internamente al constructor ThreadPoolExecutor.

Al pasar un parámetro al constructor, se crea un grupo de subprocesos con el mismo número de subprocesos principales y el número máximo de subprocesos que el parámetro ingresado. Cabe señalar aquí que la cola utilizada es LinkedBlockingQueue sin límite de capacidad superior, por lo que si la velocidad de procesamiento de la tarea es lenta, la cantidad de tareas apiladas en la cola continuará aumentando y eventualmente se acumulará en una cantidad enorme. Con el tiempo, una gran cantidad de tareas apiladas ocuparán mucha memoria y se producirá OOM (es decir, OutOfMemoryError), que afectará a casi todo el programa y tendrá graves consecuencias.

El segundo grupo de subprocesos es SingleThreadExecutor para analizar el código fuente que lo crea.

Como puede ver, los principios de newSingleThreadExecutor y newFixedThreadPool son los mismos, excepto que el número de subprocesos principales y el número máximo de subprocesos se establecen directamente en 1. Sin embargo, la cola de tareas sigue siendo un LinkedBlockingQueue ilimitado, lo que provoca el mismo problema.

El tercer tipo de grupo de subprocesos es CachedThreadPool, y el código fuente para crearlo es el siguiente.

La diferencia entre CachedThreadPool y los dos primeros grupos de subprocesos es que la cola de tareas usa SynchronousQueue. No almacena tareas, sino que las reenvía directamente. Esto no es un problema en sí mismo, pero notarás que. constructor El segundo parámetro se establece en Integer.MAX_VALUE. El significado de este parámetro es el número máximo de subprocesos. Por lo tanto, dado que CachedThreadPool no limita el número de subprocesos, cuando el número de tareas es particularmente grande, puede provocar la creación. de una gran cantidad de subprocesos, lo que eventualmente excede el límite del sistema operativo. El límite superior impide la creación de nuevos subprocesos o causa memoria insuficiente.

El cuarto grupo de subprocesos, ScheduledThreadPool, es el mismo que el quinto grupo de subprocesos, SingleThreadScheduledExecutor. El código fuente para crear ScheduledThreadPool es el siguiente.

Aquí, ScheduledThreadPoolExecutor es una subclase de ThreadPoolExecutor y su constructor se llama como se muestra a continuación.

Como puede ver en el código fuente, la cola de tareas que utiliza es DelayedWorkQueue, que es una cola retrasada y una cola ilimitada. Por lo tanto, al igual que LinkedBlockingQueue, si hay demasiadas tareas almacenadas en la cola. Causará OOM.

Todos estos tipos de grupos de subprocesos creados automáticamente conllevan riesgos. Por el contrario, crear manualmente un grupo de subprocesos es más efectivo porque podemos especificar más claramente las reglas del grupo de subprocesos. No solo podemos elegir la cantidad de subprocesos que más nos convenga, sino que también podemos rechazar el envío de nuevas tareas cuando sea necesario. evitar el consumo de recursos.