35.0、springboot-简单异步任务初体验
异步任务一般用在哪些地方呢?
我们知道网页中有些按钮一点击之后就会马上给与用户反应,而不是等程序运行完之后再给用户反应,这样可以提升用户的体验,这里就用到了多线程的技术。
接下来我们来真实的体验一下多线程的效果
第一步:我们可以先创建一个AsynchronousService.java文件如下:
package com.hkl.service;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
@Service
public class AsynchronousService {
// @Async
public void Asyn() {
try {
Thread.sleep(3000);
}catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("数据正在处理中......");
}
}
可以看到Asyn()方法里用到了Thread.sleep(3000)线程的休眠3000表示休眠3秒,
这时候如果我们调用这个方法那么就会卡3秒钟然后输出"数据正在处理中......"这段话。
但是在前端我们看到的就是网页在转圈3秒后才会给与相对应的反应,
要知道在前端等待3秒钟,是一件非常可怕的事情,这样会给与用户带来极为不好的体验
第二步:我们可以测试一下效果,先创建一个AsynController.java文件:
package com.hkl.controller;
import com.hkl.service.AsynchronousService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class AsynController {
@Autowired
private AsynchronousService asynchronousService;
@ResponseBody
@RequestMapping("/Async")
public String Async() {
asynchronousService.Asyn();
return "OK";
}
}
第三步:访问 localhost:8080/Async
访问后确实可以看到,网页在转圈加载,3秒后后台输出 "数据正在处理中......"这段话,并且前端同时给与反应返回OK字符串
那我们要怎么解决这个问题呢,我们希望访问localhost:8080/Async 后网页能够及时立马给与回应,提升用户体验,然后不影响后台程序的运行,依旧是3秒后打印出"数据正在处理中......"这段话。
我们只需要调用多线程来处理,即可完美解决!
但是我们如果每次都要手动的去编写多线程来处理的话会非常麻烦,
最简单的一种方法就是依靠spring帮我们的,只需要在AsynchronousService.java中的Asyn()方法加上@Async注解【这个注解会告诉spring,这是一个异步的方法】
然后记得在springboot启动类上用以下注释开启多线程功能:
@EnableAsync
OK,我们这时候再次启动springboot启动类,
然后访问localhost:8080/Async 会发现访问后,前端立马给出了反应返回字符号串OK,而后台并没有直接输出"数据正在处理中......",而是3秒后成功打印了这段话。