准备工具:IntelliJ IDEA
Springboot异步任务:
1.SpringbootApplication 开启异步注解功能 @EnableAsync
@EnableAsync // 开启异步注解功能
@SpringBootApplication
public class SpringbootApplication {
public static void main(String[] args) {
SpringApplication.run(Springboot09TestApplication.class, args);
}
}
- 编写AsyncService类 添加进 @Service ,方法上添加 @Async 告诉spring这是一个异步方法
注意:在类上添加@Async表示这个类下的所有方法都是异步
方法上添加@Async表示这个方法都异步
@Async所修饰的函数不要定义为static类型,这样异步调用不会生效。
本类的方法添加@Async,在本类中调用并不会异步,因为注解异步@Async是通过代理类来调用的。
若在类中直接调用,相当于this.xxx的方式,即是通过MyJobService对象直接调用的xxx方法
@Service
public class AsyncService {
@Async //告诉spring这是一个异步方法
public void helo(){
//快捷键 ctrl+alt+t
try {
Thread.sleep(3000);//等待3秒
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("数据正在加载......");
}
}
- AsyncController 控制器 ,注入 AsyncService 写方法调用 .helo()
@RestController
public class AsyncController {
@Autowired
AsyncService asyncService;
// 异步测试
@RequestMapping("/hello")
public String hello(){
asyncService.helo();//停3秒
return "OK";
}
}
4.运行时并没有直接就返回OK,而是在三秒后才返回,期间可以看到刷新按钮一直是加载的状态,由此可以看出该异步是做到了,所有任务执行完成才返回,任务执行时间正常,主线程等待其他线程完成后结束。
异步了解了也可以看看同步的效果
首先引依赖
<!-- lombok.extern.slf4j.Slf4j; -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
创建任务服务类(未做异步处理)、加入容器
package com.hh.service;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Component