写一个Executor配置类:
/**
* Description: 自定义线程池配置类,核心10个, 最大100个
* User: zhouzhou
* Date: 2018-10-24
* Time: 16:20
*/
@Configuration
@EnableAsync
@ConfigurationProperties(prefix = "spring.task.pool")
public class ExecutorConfig {
/** Set the ThreadPoolExecutor's core pool size. */
private int corePoolSize ;
/** Set the ThreadPoolExecutor's maximum pool size. */
private int maxPoolSize ;
/** Set the capacity for the ThreadPoolExecutor's BlockingQueue. */
private int queueCapacity;
@Bean
public Executor mySimpleAsync() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(corePoolSize);
executor.setMaxPoolSize(maxPoolSize);
executor.setQueueCapacity(queueCapacity);
executor.setThreadNamePrefix("ZhouZhouExecutor-");
executor.initialize();
return executor;
}
@Bean
public Executor excelAsync() { // excel的时候用
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(corePoolSize);
executor.setMaxPoolSize(maxPoolSize);
executor.setQueueCapacity(queueCapacity);
executor.setThreadNamePrefix("ExcelExecutor-");
// rejection-policy:当pool已经达到max size的时候,如何处理新任务
// CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.initialize();
return executor;
}
public int getCorePoolSize() {
return corePoolSize;
}
public void setCorePoolSize(int corePoolSize) {
this.corePoolSize = corePoolSize;
}
public int getMaxPoolSize() {
return maxPoolSize;
}
public void setMaxPoolSize(int maxPoolSize) {
this.maxPoolSize = maxPoolSize;
}
public int getQueueCapacity() {
return queueCapacity;
}
public void setQueueCapacity(int queueCapacity) {
this.queueCapacity = queueCapacity;
}
}
然后再配置yml文件
# excel解析多线程
spring.task.pool:
corePoolSize: 10
maxPoolSize: 100
queueCapacity: 10
最后调用的时候,是注解@Async后面加上你的配置的executor的bean的名称
@Async("excelAsync")
public Future<TccResult<ErrorCardOModel>> insertBankCard(BankCardIModel card) {
TccResult<ErrorCardOModel> result = new TccResult<>();
.............逻辑
}