1.异步与同步的区别
同步调用就是整个处理过程顺序执行,当各个过程都执行完毕,并返回结果。
异步调用则是只是发送了调用的指令,调用者无需等待被调用的方法完全执行完毕,而是继续执行下面的流程。
2.常规的异步调用处理方式
TopView二轮考核中有一个异步上传文件(用户头像)的功能,那时候是使用的线程池异步上传,即创建一个线程执行一段逻辑,然后把这个线程丢到线程池中去执行,但是SpringBoot简化了这一过程。
3.@Async
在Spring中,基于@Async标注的方法,称之为异步方法;这些方法将在执行的时候,将会在独立的线程中被执行,调用者无需等待它的完成,即可继续其他的操作。
分类:
①不带参数的异步调用
②带参数的异步调用
③调用返回Future的异步线程
注意
@Async注解一定是标注在ServiceImpl类的方法上,即service类的具体实现类的方法上,service类不需要注解的
4. 配合使用@EnableAsync
@EnableAsync
在启动类或者Controller类加上 @EnableAsync 注解
注意:
@EnableAsync注解的意思是开启异步执行,就是开启多线程的意思。可以标注在方法、类上。
@Async所修饰的函数不要定义为static类型,这样异步调用不会生效。
5.开启事务
在@Async标注的方法,同时也适用了@Transactional进行了标注;在其调用数据库操作之时,将无法产生事务管理的控制,原因就在于其是基于异步处理的操作。
那该如何给这些操作添加事务管理呢?可以将需要事务管理操作的方法放置到异步方法内部,在内部被调用的方法上添加@Transactional注解。
例如:
方法A,使用了@Async/@Transactional来标注,但是无法产生事务控制的目的。
方法B,使用了@Async来标注, B中调用了C、D,C/D分别使用@Transactional做了标注,则可实现事务控制的目的。
