ThreadPoolTaskExecutor创建线程池


1.前言

ThreadPoolTaskExecutor和ThreadPoolExecutor什么关系?

ThreadPoolTaskExecutor是spring core包中的,而ThreadPoolExecutor是JDK中的JUC(java.util .concurrent)
ThreadPoolTaskExecutor是对ThreadPoolExecutor进行了封装处理。
来看一下ThreadPoolExecutor和ThreadPoolTaskExecutor结构,祖类都是调用Executor接口:


下面是ThreadPoolTaskExecutor 中的部分源码,就使用到了ThreadPoolExecutor 。

public class ThreadPoolTaskExecutor extends ExecutorConfigurationSupport implements AsyncListenableTaskExecutor, SchedulingTaskExecutor {
    private final Object poolSizeMonitor = new Object();
    private int corePoolSize = 1;
    private int maxPoolSize = 2147483647;
    private int keepAliveSeconds = 60;
    private int queueCapacity = 2147483647;
    private boolean allowCoreThreadTimeOut = false;
    @Nullable
    private TaskDecorator taskDecorator;
    @Nullable
    private ThreadPoolExecutor threadPoolExecutor;
    private final Map<Runnable, Object> decoratedTaskMap;

关于ThreadPoolExecutor中参数详情看Executor的文章。

2.springboot配置使用

配置文件

@Configuration
@EnableAsync
public class SpringThreadPoolExecutorConfig {
 
    @Bean(name = "threadPoolTaskExecutor")
    public ThreadPoolTaskExecutor threadPoolTaskExecutor() {
        ThreadPoolTaskExecutor pool = new ThreadPoolTaskExecutor();
        pool.setKeepAliveSeconds(300);
        //核心线程池数
        pool.setCorePoolSize(50);
        //最大线程
        pool.setMaxPoolSize(100);
        //队列容量
        pool.setQueueCapacity(1000);
        //队列满,线程被拒绝执行策略
        pool.setRejectedExecutionHandler(new java.util.concurrent.ThreadPoolExecutor.CallerRunsPolicy());
        pool.setThreadNamePrefix("aaaa-common-support-service--");
        return pool;
    }

Reject策略预定义有四种

  • ThreadPoolExecutor.AbortPolicy策略,是默认的策略,处理程序遭到拒绝将抛出运行时 RejectedExecutionException。

  • ThreadPoolExecutor.CallerRunsPolicy策略 ,调用者的线程会执行该任务,如果执行器已关闭,则丢弃.

  • ThreadPoolExecutor.DiscardPolicy策略,不能执行的任务将被丢弃.

  • ThreadPoolExecutor.DiscardOldestPolicy策略,如果执行程序尚未关闭,则位于工作队列头部的任务将被删除,然后重试执行程序(如果再次失败,则重复此过程).

使用

@Slf4j
@Service("AService")
public class AServiceImpl implements AService {
 
	@Autowired
	private ThreadPoolTaskExecutor threadPoolTaskExecutor;
 
	@Override
	public List<String> queryUserByGivenname(String txNo, String givenname)
			throws ParamInvalidException {	
			threadPoolTaskExecutor.execute(()->{
				log.info("-------txNO[{}],givename[{}]", txNo,givenname);
			});
		return null;
	}
}


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM