一、简介
1)在方法上使用该@Async注解,申明该方法是一个异步任务;
2)在类上面使用该@Async注解,申明该类中的所有方法都是异步任务;
3)方法上一旦标记了这个@Async注解,当其它线程调用这个方法时,就会开启一个新的子线程去异步处理该业务逻辑。
4)使用此注解的方法的类对象,必须是spring管理下的bean对象;
5)要想使用异步任务,需要在主类上开启异步配置,即配置上@EnableAsync注解;
二、使用
1、基础代码示例
1)启动类中增加@EnableAsync
以Spring boot 为例,启动类中增加@EnableAsync:
@EnableAsync
@SpringBootApplication
public class ManageApplication {
//...
}
1
2
3
4
5
2)方法上加@Async注解:
@Component
public class MyAsyncTask {
@Async
public void asyncCpsItemImportTask(Long platformId, String jsonList){
//...具体业务逻辑
}
}
1
2
3
4
5
6
7
2、隐含问题一:默认线程池配置不合适,导致系统奔溃
@Async注解在使用时,如果不指定线程池的名称,则使用Spring默认的线程池,Spring默认的线程池为SimpleAsyncTaskExecutor。
该类型线程池的默认配置:
默认核心线程数:8,
最大线程数:Integet.MAX_VALUE,
队列使用LinkedBlockingQueue,
容量是:Integet.MAX_VALUE,
空闲线程保留时间:60s,
线程池拒绝策略:AbortPolicy。
1
2
3
4
5
6
7
从最大线程数的配置上,相信你也看到问题了:并发情况下,会无限创建线程、然后OOM、然后系统崩溃。。。