Grupo de subprocesos de [código fuente de JUC]: resumen de ThreadPoolExecutor (5)

Serie de grupos de hilos:

Después de analizar el código fuente de ThreadPoolExecutor en los artículos anteriores, resumiremos la información clave de ThreadPoolExecutor:

1) El grupo de subprocesos resuelve dos problemas:

  • Al reducir la sobrecarga de programación entre tareas (principalmente por la forma en que se reutilizan los subprocesos en el grupo de subprocesos), para mejorar el rendimiento de ejecución de una gran cantidad de tareas
  • Proporciona una forma de administrar subprocesos y consumo, mantener estadísticas de datos básicos y otras tareas, como contar el número de tareas completadas;

2) Parámetros relacionados con la capacidad del grupo de subprocesos:

  • coreSize: cuando se envía una nueva tarea, se encuentra que el número de subprocesos en ejecución es menor que coreSize, se creará un nuevo subproceso, incluso si otros subprocesos de trabajo están inactivos en este momento, coreSize se puede obtener a través del método getCorePoolSize

  • maxSize: cuando se envía la tarea, coreSize <número de subprocesos en ejecución <= maxSize, pero cuando la cola no está llena, la tarea se envía a la cola. Si la cola está llena, cree un nuevo subproceso dentro del rango permitido por maxSize ;

    En términos generales, coreSize y maxSize ya están configurados cuando se inicializa el grupo de subprocesos, pero también podemos modificar dinámicamente estos dos valores a través de los métodos setCorePoolSize y setMaximumPoolSize;

3) Parámetro de tiempos de mantenimiento:

  • Función: Si hay subprocesos que exceden coreSize en el grupo de subprocesos actual, y el tiempo de inactividad de los subprocesos excede keepAliveTime, el subproceso actual se reciclará, lo que puede evitar el desperdicio de recursos cuando no se usa el subproceso;
  • El valor de keepAliveTime se puede establecer dinámicamente mediante el método setKeepAliveTime;
  • Si allowCoreThreadTimeOut se establece en true, el subproceso principal se reciclará si su tiempo de inactividad excede keepAliveTime;

4) Hay muchas opciones de cola al crear un grupo de subprocesos, como:

  • ArrayBlockingQueue, una cola limitada, puede evitar que se agoten los recursos;
  • LinkedBlockingQueue, cola ilimitada, las tareas no consumidas pueden esperar en la cola
  • SynchronousQueue, para evitar el rechazo de tareas, requiere que el tamaño máximo del grupo de subprocesos sea ilimitado. La desventaja es que cuando la velocidad de envío de la tarea excede la velocidad de consumo, puede ocurrir un crecimiento ilimitado de subprocesos.

5) Estrategia de rechazo: cuando el Ejecutor se ha cerrado o el hilo máximo y la cola máxima están saturados, la clase RejectedExecutionHandler se puede usar para capturar excepciones. Hay cuatro estrategias de procesamiento de la siguiente manera:

  • AbortPolicy (predeterminado): lanza una excepción
  • CallerRunsPolicy: no use el grupo de subprocesos, el subproceso principal para ejecutar
  • DiscardPolicy: descarta directamente la tarea
  • DiscardOldestPolicy: descarta la tarea más antigua de la cola

6) ExecutorService usa subprocesos en el grupo de subprocesos para ejecutar las tareas enviadas. El grupo de subprocesos se puede configurar utilizando Ejecutores. Los ejecutores establecen un método para inicializar directamente el grupo de subprocesos para escenarios comunes, como:

  • Ejecutores # newCachedThreadPool Grupo de subprocesos ilimitado, y se puede reciclar automáticamente
  • Ejecutores # newFixedThreadPool grupo de subprocesos de tamaño fijo
  • Ejecutores # newSingleThreadExecutor grupo de subprocesos de un solo hilo;

7) Además, el grupo de subprocesos proporciona muchas funciones de enlace que se pueden ampliar, como:

  • Proporciona métodos de enlace para beforeExecute y afterExecute antes de que se ejecute cada tarea, que se utilizan principalmente para operar el entorno de ejecución, como inicializar ThreadLocals, recopilar estadísticas, agregar entradas de registro, etc.
  • Si desea hacer algo después de que se complete la ejecución del ejecutor, puede implementar el método terminado. Si ocurre una excepción durante la ejecución del método de gancho, el hilo de trabajo puede fallar y terminar inmediatamente.

Supongo que te gusta

Origin blog.csdn.net/weixin_43935927/article/details/113965332
Recomendado
Clasificación