前言
众所周知,java的代码是同步顺序执行,当我们需要执行异步操作时我们需要创建一个新线程去执行,以往我们是这样操作的:
/*** 任务类*/
class Task implementsRunnable {
@Overridepublic voidrun() {
System.out.println(Thread.currentThread().getName()+ ":异步任务");
}
}
//新建线程并执行任务类
new Thread(new Task()).start();
jdk1.8之后可以使用Lambda 表达式
//新建线程并执行任务类
new Thread(() ->{
System.out.println(Thread.currentThread().getName()+ ":异步任务");
}).start();
当然,除了显式的new Thread,我们一般通过线程池获取线程,这里就不再展开
本文记录在SpringBoot项目中使用@Async注解,实现优雅的异步调用
代码与测试
项目工程结构
因为要测试事务,所以需要引入
org.springframework.boot
spring-boot-starter-data-jpa
mysql
mysql-connector-java
在启动类开启启用异步调用,同时注入ApplicationRunner对象在启动类进行调用测试
packagecn.huanzi.qch.springbootasync;importcn.huanzi.qch.springbootasync.service.TestService;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.boot.ApplicationRunner;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.context.annotation.Bean;importorg.springframework.scheduling.annotation.EnableAsync;importorg.springframework.stereotype.Component;
@Component
@EnableAsync//开启异步调用
@SpringBootApplicationpublic classSpringbootAsyncApplication {
@AutowiredprivateTestService testService;public static voidmain(String[] args) {
SpringApplication.run(SpringbootAsyncApplication.class, args);
}/*** 启动成功*/@BeanpublicApplicationRunner applicationRunner() {return applicationArguments ->{long