异步任务


同步(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


posted @ 2022-03-22 11:04  卡卡发  阅读(63)  评论(0)    收藏  举报