[Grupo de subprocesos] Grupo de subprocesos ThreadPoolTaskExecutor utilizado en el proyecto

Cuando se realizan operaciones concurrentes o asincrónicas, se utilizará ThreadPoolTaskExecutor. El grupo de subprocesos utilizado en el proyecto es ThreadPoolTaskExecutor. Esta clase está bajo el paquete Spring y es una clase de grupo de subprocesos proporcionada por Spring. Aquí nos centraremos en la configuración y los detalles del grupo de subprocesos de Spring ThreadPoolTaskExecutor.

  1. La configuración de ThreadPoolTaskExecutor se puede crear en función de la configuración xml, que se puede configurar en spring.xml
 <!-- spring thread pool executor -->           
 2     <bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
 3         <!-- 线程池维护线程的最少数量 -->
 4         <property name="corePoolSize" value="5" />
 5         <!-- 允许的空闲时间 -->
 6         <property name="keepAliveSeconds" value="200" />
 7         <!-- 线程池维护线程的最大数量 -->
 8         <property name="maxPoolSize" value="10" />
 9         <!-- 缓存队列 -->
10         <property name="queueCapacity" value="20" />
11         <!-- 对拒绝task的处理策略 -->
12         <property name="rejectedExecutionHandler">
13             <bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy" />
14         </property>
15     </bean>

Descripción del campo de atributo

corePoolSize: el número mínimo de subprocesos para el mantenimiento del grupo de subprocesos

keepAliveSeconds: tiempo libre permitido

maxPoolSize: el número máximo de subprocesos para el mantenimiento del grupo de subprocesos

queueCapacity: cola de caché

jectedExecutionHandler: la estrategia de procesamiento para tareas rechazadas

El campojectedExecutionHandler se utiliza para configurar estrategias de rechazo. Las estrategias de rechazo comunes son las siguientes:

AbortPolicy: el controlador para tareas rechazadas, arrojará RejectedExecutionException

CallerRunsPolicy: un controlador para tareas rechazadas, que ejecuta las tareas rechazadas directamente en el hilo de llamada del método de ejecución.

DiscardOldestPolicy: un controlador para tareas rechazadas, que abandona la solicitud sin procesar más antigua y luego vuelve a intentar ejecutarla.

DiscardPolicy: un controlador para las tareas rechazadas. De forma predeterminada, descartará las tareas rechazadas.

En el proyecto, inyecte el grupo de subprocesos mediante inyección automática

@Resource(name="taskExecutor")
ThreadPoolTaskExecutor taskExecutor;
// 也可以直接用@Autowried
@AutoWired
ThreadPoolTaskExecutor taskExecutor

También configure el grupo de subprocesos configurando la clase y luego inyecte

@Configuration
public class ExecturConfig {
    
    
    @Bean("taskExector")
    public Executor taskExector() {
    
    
 
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        int i = Runtime.getRuntime().availableProcessors();//获取到服务器的cpu内核
        executor.setCorePoolSize(5);//核心池大小
        executor.setMaxPoolSize(100);//最大线程数
        executor.setQueueCapacity(1000);//队列程度
        executor.setKeepAliveSeconds(1000);//线程空闲时间
        executor.setThreadNamePrefix("tsak-asyn");//线程前缀名称
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());//配置拒绝策略
        return executor;
    }

Enviar tareas:
void ejecutar (comando Ejecutable)
Use ejecutar (Ejecutable)
para tareas sin valor de retorno, use enviar (Ejecutable) para tareas con valor de retorno

Flujo de procesamiento
1. Cuando se envía una tarea al grupo de subprocesos, primero verifique si los subprocesos centrales del grupo de subprocesos están ejecutando tareas, si no, seleccione un subproceso para ejecutar la tarea y, si es así, ejecute el segundo paso.
2. Compruebe si el grupo de subprocesos principal está lleno, cree un subproceso para realizar la tarea si no está satisfecho, de lo contrario, realice el tercer paso.
3. Compruebe si la cola de tareas está llena y guarde la tarea en la cola de tareas cuando no esté satisfecha; de lo contrario, realice el cuarto paso.
4. Verifique si el grupo de subprocesos está lleno, cree un subproceso para realizar tareas cuando no esté satisfecho, de lo contrario, procese las tareas que no se pueden realizar de acuerdo con la estrategia.
Cierre el
código de implementación del grupo de subprocesos showdow ():

if (this.executor != null) {
    
    
if (this.waitForTasksToCompleteOnShutdown) {
    
    
this.executor.shutdown();//中断未执行完的线程
} else {
    
    
Iterator var1 = this.executor.shutdownNow().iterator();
while(var1.hasNext()) {
    
    
Runnable remainingTask = (Runnable)var1.next();
this.cancelRemainingTask(remainingTask);//取消所有剩下需要执行的线程
}
}

Llamar a shutdown o shutdownNow, ninguno aceptará nuevas tareas, e interrumpirá el hilo llamando al método de interrupción del hilo para que se detenga, es posible que el hilo nunca se interrumpa, la diferencia es que shutdownNow primero establecerá el estado del grupo de hilos DETÉNGASE y luego intente detener todos los subprocesos (puede que algunas tareas no se completen) y luego vuelva a la lista de tareas no ejecutadas. Y shutdown simplemente establece el estado del grupo de subprocesos en apagado, luego interrumpe todos los subprocesos que no están realizando tareas y ejecuta las tareas restantes.

Configurar el número de subprocesos
Si se trata de una tarea que consume mucha CPU, el número de subprocesos en el grupo de subprocesos debe ser lo más pequeño posible, generalmente el número de CPU + 1 subproceso.
Si es una tarea intensiva en E / S, entonces los subprocesos del grupo de subprocesos pueden ser grandes, como la cantidad de 2 * CPU.
Para las tareas mixtas, si se pueden dividir, se pueden dividir en intensivas en CPU e intensivas en IO para mejorar la eficiencia de ejecución; si no se pueden dividir, el número de subprocesos en el grupo de subprocesos se puede ajustar de acuerdo con la situación real.


Estado común para supervisar el estado del grupo de subprocesos :
taskCount: el número de tareas que el subproceso debe ejecutar.
completeTaskCount: el número de tareas completadas por el grupo de subprocesos durante su funcionamiento.
largePoolSize: el mayor número de subprocesos jamás creado por el grupo de subprocesos.
getPoolSize obtiene el número de subprocesos en el grupo de subprocesos actual.
getActiveCount: obtiene la cantidad de subprocesos activos

if(executor.getActiveCount() > (executor.getPoolSize()-1)){
    
    
	//核心线程池已满
	return;
}
Runnable runnable = ()->{
    
    
	//业务方法
};
executor.executor(runnable);

Supongo que te gusta

Origin blog.csdn.net/weixin_42777004/article/details/107880975
Recomendado
Clasificación