Why
直接使用@Async的话,每次都会新创建一个线程,当任务很频繁的时候就会出现耗费资源的情况,所以如果任务量大的话,使用线程池
How
增加配置类,声明特定@Bean
@Configuration public class AsyncConfig { @Bean("myExecutor") public Executor taskExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(20); executor.setMaxPoolSize(200); executor.setQueueCapacity(500); executor.setKeepAliveSeconds(60); executor.setThreadNamePrefix("myExecutor-"); return executor; } }使用的时候 @Async(“myExecutor”)就可以了
加一个线程流程图
参数说明:
corePoolSize:线程池维护线程最小数量maxPoolSize:线程池维护线程最大数量keepAliveSeconds: **(maxPoolSize-corePoolSize)**部分线程空闲最大存活时间queueCapacity:阻塞任务队列AllowCoreThreadTimeOut:设置为true的话,keepAliveSeconds参数设置的有效时间对corePoolSize线程也有效RejectedExecutionHandler:当提交任务数超过maxmumPoolSize+workQueue之和时,任务会交给RejectedExecutionHandler来处理