一、单纯使用@Async注解。
1、@Async
注解在使用时,如果不指定线程池的名称,则使用Spring
默认的线程池,Spring
默认的线程池为SimpleAsyncTaskExecutor。
2、
方法上一旦标记了这个@Async
注解,当其它线程调用这个方法时,就会开启一个新的子线程去异步处理该业务逻辑。
Spring
默认的线程池配置为:
核心线程数 (corePoolSize): 8
最大线程数 (maxPoolSize): Integer.MAX_VALUE (无限制)
任务等待队列容量 (queueCapacity): Integer.MAX_VALUE (无限制)
空闲线程等待时间 (keepAliveSeconds): 60秒(超过这个时间没有任务调度,则线程会被回收)
线程池拒绝策略 (RejectedExecutionHandler): AbortPolicy(默认策略,超出线程池容量和队列容量时抛出RejectedExecutionException异常)
缺点
:并发情况下,会无限创建线程。自定义配置参数可以解决该问题。
在配置文件中配置即可:
spirng:task:execution:# 线程名称前缀thread-name-prefix:pool:# 最大线程数,默认为Integer.MAX_VALUEmax-size:# 核心线程数,默认为8core-size:# 空闲线程等待时间,默认为60s。如果超过这个时间没有任务调度,则线程会被回收keep-alive:# 任务等待队列容量,默认为Integer.MAX_VALUE 无限制queue-capacity:# 是否允许回收空闲的线程,默认为trueallow-core-thread-timeout:
二、如果需要更加精确地控制线程池的参数,您也可以在配置类中自定义一个 ThreadPoolTaskExecutor
bean,并根据具体需求设置相应的参数。
配置类如下:
@Configuration
public class ThreadPoolConfig {@Bean("myExecutor")public Executor taskExecutor() {ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();//设置线程池参数信息taskExecutor.setCorePoolSize(10);taskExecutor.setMaxPoolSize(50);taskExecutor.setQueueCapacity(200);taskExecutor.setKeepAliveSeconds(60);taskExecutor.setThreadNamePrefix("myExecutor--");taskExecutor.setWaitForTasksToCompleteOnShutdown(true);//线程池中任务等待时间,超过等待时间直接销毁taskExecutor.setAwaitTerminationSeconds(60);//修改拒绝策略为使用当前线程执行taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());//初始化线程池taskExecutor.initialize();return taskExecutor;}
}
可配合@Async注解使用:
@Async("myExecutor")
public void hello(String name){logger.info("异步线程启动 started."+name);
}