TaskPoolConfig.java 2.5 KB
package com.skua.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.ThreadPoolExecutor;

/**
 * @program: skboot
 * @description: 线程词配置类
 * @author: xie chao
 * @create: 2022-03-02 11:34
 */
@Configuration
//开启异步调用, 即哪个方法用了 @Async("taskExecutor"),就会通过线程池调用
@EnableAsync
public class TaskPoolConfig {

    @Bean(name="taskExecutor")
    public ThreadPoolTaskExecutor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        //配置核心线程数:就是线程池中的核心线程数量,这几个核心线程,只是在没有用的时候,也不会被回收
        executor.setCorePoolSize(10);
        //配置最大线程数:就是线程池中可以容纳的最大线程的数量
        executor.setMaxPoolSize(200);
        //配置队列大小
        executor.setQueueCapacity(500);
        //线程池维护线程所允许的空闲时间:就是线程池中除了核心线程之外的其他的最长可以保留的时间,因为在线程池中,除了核心线程即使在无任务的情况下也不能被清除,其余的都是有存活时间的,意思就是非核心线程可以保留的最长的空闲时间
        executor.setKeepAliveSeconds(60);
        //配置线程池中的线程的名称前缀
        executor.setThreadNamePrefix("task-executor-");

        // handler,是一种拒绝策略,我们可以在任务满了之后,拒绝执行某些任务。
        // rejection-policy:当pool已经达到max size的时候,如何处理新任务
        // CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        // AbortPolicy:用于被拒绝任务的处理程序,它将抛出RejectedExecutionException
        // CallerRunsPolicy:用于被拒绝任务的处理程序,它直接在execute方法的调用线程中运行被拒绝的任务。
        // DiscardOldestPolicy:用于被拒绝任务的处理程序,它放弃最旧的未处理请求,然后重试execute。
        // DiscardPolicy:用于被拒绝任务的处理程序,默认情况下它将丢弃被拒绝的任务。

        //执行初始化
        executor.initialize();
        return executor;
    }
}