zoukankan      html  css  js  c++  java
  • SpringBoot2.x异步任务EnableAsync

    1.springboot启动类里面使用@EnableAsync注解开启异步功能

    @EnableAsync
    public class Demo001Application {
        public static void main(String[] args) {
            SpringApplication.run(Demo001Application.class, args);
        }
    }

    2.异步任务类使用@Component标记组件被容器扫描,异步方法加上@Async

    package com.xiaobing.demo001.task;
    
    import com.xiaobing.demo001.domain.User;
    import org.springframework.scheduling.annotation.Async;
    import org.springframework.scheduling.annotation.AsyncResult;
    import org.springframework.stereotype.Component;
    import java.util.concurrent.Future;
    
    //@Async 类注释等同所有方法注释
    @Component
    public class AsynchronousTask {
    
        @Async
        public void task01() throws Exception{
            System.out.println("AsynchronousTask.task01");
            Thread.sleep(3000);
        }
    
        //增加Future 返回结果AsyncResult
        @Async
        public Future<Boolean> task02()throws Exception{
            System.out.println("AsynchronousTask.task02");
            Thread.sleep(3000);
            return new AsyncResult<>(true);
        }
        @Async
        public Future<String> task03()throws Exception{
            System.out.println("AsynchronousTask.task03");
            Thread.sleep(3000);
            return new AsyncResult<>("task03执行");
        }
        @Async
        public Future<User> task04()throws Exception{
            System.out.println("AsynchronousTask.task04");
            Thread.sleep(3000);
            return new AsyncResult<>(new User(01,"Tom","123456"));
        }
    }

    3.新建controller

    package com.xiaobing.demo001.controller;
    
    import com.xiaobing.demo001.domain.Result;
    import com.xiaobing.demo001.task.AsynchronousTask;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    @RequestMapping("api/v1/test")
    public class AsynchronousTaskController {
    
        @Autowired
        private AsynchronousTask asynchronousTask;
        @GetMapping("/asynchronous")
        public Result asynchronousTask() throws  Exception{
            long start = System.currentTimeMillis();
            asynchronousTask.task01();
            asynchronousTask.task02();
            asynchronousTask.task03();
            asynchronousTask.task04();
            long end = System.currentTimeMillis();
            return new Result(1,"耗时:"+(end-start),"");
        }
    
    }

    4.启动项目后访问

     5.将@Async注释后访问

     6.注意:如果需要拿到结果 需要判断 task.isDone()

    package com.xiaobing.demo001.controller;
    
    import com.xiaobing.demo001.domain.Result;
    import com.xiaobing.demo001.domain.User;
    import com.xiaobing.demo001.task.AsynchronousTask;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    import java.util.concurrent.Future;
    
    @RestController
    @RequestMapping("api/v1/test")
    public class AsynchronousTaskController {
    
        @Autowired
        private AsynchronousTask asynchronousTask;
        @GetMapping("/asynchronous")
        public Result asynchronousTask() throws  Exception{
            long start = System.currentTimeMillis();
            asynchronousTask.task01();
            asynchronousTask.task02();
            asynchronousTask.task03();
            Future<User> user =  asynchronousTask.task04();
            while (!user.isDone()){
                if(user.isDone()){
                    User us =  user.get();
                    System.out.println(us);
                    break;
                }
            }
            long end = System.currentTimeMillis();
            return new Result(1,"耗时:"+(end-start),"");
        }
    
    }

    运行项目:

     输出:

     7. 异步的使用场景:

    1)不涉及共享资源,或对共享资源只读,即非互斥操作
    2)没有时序上的严格关系
    3)不需要原子操作,或可以通过其他方式控制原子性
    4)常用于IO操作等耗时操作,因为比较影响客户体验和使用性能
    5)不影响主线程逻辑

    8. 同步的好处:
    1)同步流程对结果处理通常更为简单,可以就近处理。
    2)同步流程对结果的处理始终和前文保持在一个上下文内。
    3)同步流程可以很容易捕获、处理异常。
    4)同步流程是最天然的控制过程顺序执行的方式。

    9. 异步的好处:
    1)异步流程可以立即给调用方返回初步的结果。
    2)异步流程可以延迟给调用方最终的结果数据,在此期间可以做更多额外的工作,例如结果记录等等。
    3)异步流程在执行的过程中,可以释放占用的线程等资源,避免阻塞,等到结果产生再重新获取线程处理。
    4)异步流程可以等多次调用的结果出来后,再统一返回一次结果集合,提高响应效率。

    -------------------------------------------  学习记录!!! -----------------------------------------------

  • 相关阅读:
    LTE第一章 介绍
    一本关于 LTE 非常好的书籍
    Memcached安装卸载
    很好很实用的.net、网站系统后台模板
    MS SQL 当记录不存在时插入insert INTO not exists
    数据库存储过程缺点总结
    存储过程是罪恶
    树形数据查询示例
    安装Discuz!论坛时提示“mysqli_connect() 不支持 advice_mysqli_connect”
    sql server中将一个表中的部分数据插入到另一个表中
  • 原文地址:https://www.cnblogs.com/xiaozhaoboke/p/14689637.html
Copyright © 2011-2022 走看看