不知道当时看的谁写的,然后自己根据需求改了下。
需要自定义参数的话,就搞一个静态代码块调用这几个方法设置一下
线程工具类
@Slf4j
@Configuration
@EnableAsync
public class ExecutorConfig {
private static ExecutorConfig executorConfig;
//核心线程数
private static int CORE_POOL_SIZE = 5;
//最大线程数
private static int MAX_POOL_SIZE = 5;
//队列大小
private static int QUEUE_CAPACITY = 500;
/**
* 核心线程数
* @param corePoolSize
* @return
*/
public ExecutorConfig setCorePoolSize(Integer corePoolSize) {
CORE_POOL_SIZE = corePoolSize;
return this.getExecutorConfig();
}
/**
* 最大线程数
* @param queueCapacity
* @return
*/
public ExecutorConfig setMaxPoolSize(Integer queueCapacity) {
MAX_POOL_SIZE = queueCapacity;
return this.getExecutorConfig();
}
/**
* 队列大小
* @param queueCapacity
* @return
*/
public ExecutorConfig setQueueCapacity(Integer queueCapacity) {
QUEUE_CAPACITY = queueCapacity;
return this.getExecutorConfig();
}
public static ExecutorConfig getExecutorConfig() {
if (null == executorConfig) {
synchronized (ExecutorConfig.class) {
if (null == executorConfig) {
return executorConfig = SpringUtils.getBean(ExecutorConfig.class);
}
}
}
return executorConfig;
}
@Bean
public Executor asyncServiceExecutor() {
log.info("start asyncServiceExecutor");
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
//配置核心线程数
executor.setCorePoolSize(CORE_POOL_SIZE);
//配置最大线程数
executor.setMaxPoolSize(MAX_POOL_SIZE);
//配置队列大小
executor.setQueueCapacity(QUEUE_CAPACITY);
//配置线程池中的线程的名称前缀
executor.setThreadNamePrefix("async-service-");
// 拒绝策略
// rejection-policy:当pool已经达到max size的时候,如何处理新任务
// CallerRunsPolicy():交由调用方线程运行,比如 main 线程;如果添加到线程池失败,那么主线程会自己去执行该任务,不会等待线程池中的线程去执行
// AbortPolicy():该策略是线程池的默认策略,如果线程池队列满了丢掉这个任务并且抛出RejectedExecutionException异常。
// DiscardPolicy():如果线程池队列满了,会直接丢掉这个任务并且不会有任何异常
// DiscardOldestPolicy():丢弃队列中最老的任务,队列满了,会将最早进入队列的任务删掉腾出空间,再尝试加入队列
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
//执行初始化
executor.initialize();
return executor;
}
}
调用
@Slf4j
@Component
@EnableRetry //这个注解为spring-retry中断重试注解
public class SAsyncService extends SCommon {
/**
*
*/
@Retryable //这个注解为spring-retry中断重试注解
@Async("asyncServiceExecutor") //这里则为使用线程池,参数为线程池类名称
public void make() {
log.info("线程池方法");
}
}