一、简介


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、然后系统崩溃。。。