异步方法执行的线程池
默认情况下,Spring会查找一个关联的线程池:要么是一个org.springframework.core.task.TaskExecutor类型的bean,要么是一个类型是 java.util.concurrent.Executor名字是taskExecutor的bean。如果这两个都没找到,Spring会使用org.springframework.core.task.SimpleAsyncTaskExecutor来执行异步方法,SimpleAsyncTaskExecutor实际上并不是线程池,它是为每一个新任务创建一个新的线程。
-
@EnableAsync:开启异步支持
-
@Async:用来标记一个方法是异步执行的,表示调用该方法的线程与此方法异步执行,它可以加在方法上也可以加在类上,如果是加在类上,说明类里面所有的方法都是异步执行的。
目标方法可以有任意的参数,但是返回值只能要么是void(那么调用过程中的异常信息是无法返回给调用者的,默认只是记录日志。),要么是Future,如果是Future,也可以返回它的子类ListenableFuture或者CompletableFuture,这样就可以跟异步任务更好的进行交互,如果不是future是无法获取返回值的。
如下方式会使@Async失效
-
异步方法使用static修饰
-
异步类没有使用@Component注解(或其他注解)导致spring无法扫描到异步类
-
类中需要使用@Autowired或@Resource等注解自动注入,不能自己手动new对象
-
如果使用SpringBoot框架必须在启动类中增加@EnableAsync注解
-
在Async 方法上标注@Transactional是没用的。 在Async 方法调用的方法上标注@Transactional 有效。
-
调用被@Async标记的方法的调用者不能和被调用的方法在同一类中不然不会起作用