异步任务
同步(Synchronous)
异步(Asynchronous)
在开发中,我们可能经常会遇到一些需要执行时间很长的任务,如果放在前端,会让用户一直卡在那儿等待或者一直转圈圈,体验非常不好。因此使用异步方法可以把耗时的任务扔到后台,而前端给用户立即返回,待用户需要查看结果时,点击查看即可,并且可以随时看到任务执行的状态。
原来的
srvice:
@Service
public class AsyncService {
public void hello(){
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("数据正在处理。。。。");
}
controller:
@RestController
public class AsyncController {
@Autowired
AsyncService asyncService;
@RequestMapping("/hello")
public String hello(){
asyncService.hello();//调用这个方法会停止三秒
return "OK";
}
}
启动后,访问localhost:8080/hello需要等到3秒才会加载出"ok"
加了异步注解后
service: @Async
@Service
public class AsyncService {
@Async //告诉spring这是一个异步的方法
public void hello(){
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("数据正在处理。。。。");
}
要使用异步注解,需要在主方法上开启异步注解:@EnableAsync
@EnableAsync //开启异步注解功能
@SpringBootApplication
public class Springboot09Application {
public static void main(String[] args) {
SpringApplication.run(Springboot09Application.class, args);
}
}
此时,不需要等待三秒才显示"ok",会立即加载出来。而 Thread.sleep(3000)会在后台运行
-
同步任务是那些在主线程上排队执行的任务。只有前一个任务执行完毕了,才会开始执行后面一个任务,在所有任务没有执行完之前,不能执行任务后面的代码。
-
异步任务是那些不进入主线程、而进入任务队列的任务。只有当引擎认为某个异步任务可以执行了(比如Ajax操作从服务器得到了结果),该任务(采用回调函数的形式)才会进入主线程执行。排在异步任务后面的代码,不用等待异步任务结束才执行,而会马上执行。也就是说异步任务不具有“堵塞”效应。
-
举例说明:比如Ajax操作既可以同步任务处理,也可以异步任务处理。这由开发者决定。如果是同步任务,主线程就等着Ajax操作返回结果,再往下执行;如果是异步任务,主线程在发出Ajax请求以后,就直接往下执行,执行后面的代码,等到Ajax操作有了结果,主线程再执行对应的回调函数。
参考链接:https://blog.csdn.net/m0_51278137/article/details/120344256