【Spring】@Async & @Schedule

代码位置: spring-context\src\main\java\org\springframework\scheduling\annotation

实现原理: 有对应的BeanPostProcessor实现类

@Async + @EnableAsync

1. 在方法上使用@Async注解,申明该方法是一个异步任务;
2. 在类上面使用@Async注解,申明该类中的所有方法都是异步任务;
3. 使用此注解的方法的类对象,必须是spring管理下的bean对象;
4. Spring Boot启动类中增加@EnableAsync

a.@Async注解在使用时,如果不指定线程池的名称,则使用Spring默认的线程池,Spring默认的线程池为SimpleAsyncTaskExecutor
b.方法上一旦标记了@Async注解,当其它线程调用这个方法时,就会开启一个新的子线程去异步处理该业务逻辑。

使用测试:https://blog.csdn.net/qq_22076345/article/details/82194482

扩展:实现使用的线程池问题 https://cloud.tencent.com/developer/article/1834780

  1、SimpleAsyncTaskExecutor:不是真的线程池,这个类不重用线程,默认每次调用都会创建一个新的线程。  // SimpleAsyncTaskExecutor提供了限流机制,通过concurrencyLimit属性来控制开关,当concurrencyLimit>=0时开启限流机制,默认关闭限流机制即  concurrencyLimit=-1,当关闭情况下,会不断创建新的线程来处理任务。基于默认配置,SimpleAsyncTaskExecutor并不是严格意义的线程池,达不到线程复用的功能。

  2、自定义线程池,可对系统中线程池更加细粒度的控制,方便调整线程池大小配置,线程执行异常控制和处理。在设置系统自定义线程池代替默认线程池时,虽可通过多种模式设置,但替换默认线程池最终产生的线程池有且只能设置一个(不能设置多个类继承AsyncConfigurer)自定义线程池有如下模式:

  • 重新实现接口AsyncConfigurer
  • 继承AsyncConfigurerSupport
  • 配置由自定义的TaskExecutor替代内置的任务执行器

 

posted @ 2024-01-09 10:38  飞翔在天  阅读(16)  评论(0编辑  收藏  举报