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;
}
}