专栏首页IT笔记分享spring boot使用@Async异步任务

spring boot使用@Async异步任务

开启异步任务

在应用主类中添加@EnableAsync注解

写异步任务方法

@Async
    public Future<String> ansync(String name){
        try {
            Thread.sleep(10000);
            logger.info("这里是异步方法");
            logger.info("传过来的名字是:" + name);
            name = "修改的名字";
            logger.info("修改后的名字是:" + name);
            return new AsyncResult<>("name: " + name);
        }catch (Exception e){
            return new AsyncResult<>("异常");
        }
    }

调用异步方法

  • 1、用Future获取返回值
public String requestAnsync(String name){
        try {
            Long start = System.currentTimeMillis();
            Future<String> result = ansync(name);
            if (result.isDone()){
                name = result.get();
                logger.info("异步方法结束,名字改为:" + name);
            }
            Long end = System.currentTimeMillis();
            logger.info("耗时:" + (int)(end-start));
            return "hello " + name;
        }catch (Exception e){
            logger.error("异常");
            return "异常";
        }
    }

返回值,若想获取到返回值,应该轮询方法获取,否则若果没有isDone则不会走下面的方法,或者可以使用CompletableFuture:

2018-07-17 11:31:55.390  INFO 5232 --- [nio-8080-exec-6] c.e.async.service.AsyncTestService       : 耗时:0
2018-07-17 11:32:05.394  INFO 5232 --- [cTaskExecutor-3] com.example.async.service.AsyncTest      : 这里是异步方法
2018-07-17 11:32:05.394  INFO 5232 --- [cTaskExecutor-3] com.example.async.service.AsyncTest      : 传过来的名字是:ling
2018-07-17 11:32:05.394  INFO 5232 --- [cTaskExecutor-3] com.example.async.service.AsyncTest      : 修改后的名字是:修改的名字

如果使用future.get()方法会阻塞线程直到拿到结果。

  • 2、不使用future.get()方法,异步方法不使用Future返回
@Async
    public void noReturnAsync(String name){
        try {
            Thread.sleep(10000);
            logger.info("这里是异步方法");
            logger.info("传过来的名字是:" + name);
            name = "修改的名字";
            logger.info("修改后的名字是:" + name);
        }catch (Exception e){
        }
    }

调用异步的方法

public String noReturn(String name){
        Long start = System.currentTimeMillis();
        asyncTest.noReturnAsync(name);
        Long end = System.currentTimeMillis();
        logger.info("耗时:" + (int)(end-start));
        return "hello " + name;
    }

注意的地方:

如果异步方法变成阻塞的同步方法,可能原因是异步方法和普通的调用方法在同一个类中,解决方法是将异步方法单独放到一个类中。 产生原因:spring对@Transactional注解时也有类似问题,spring扫描时具有@Transactional注解方法的类时,是生成一个代理类,由代理类去开启关闭事务,而在同一个类中,方法调用是在类体内执行的,spring无法截获这个方法调用。 具体参见:Spring Boot使用@Async实现异步调用github项目地址:https://github.com/lgsdaredevil/asyncTest

本文分享自微信公众号 - IT笔记分享(xiaosen_javashare),作者:xiaosen

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-02-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java多线程学习(四)——volatile关键字

    当用volatile关键字声明变量的时候,就等于告诉虚拟机,这个变量极有可能被某些程序或者线程修改,为了保证比那辆被修改后应用程序范围内的所有线程可以看到这个改...

    小森啦啦啦
  • 设计模式(七)——模板模式

    定义一个操作中的算法框架,将一些步骤延迟到子类中,使子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。

    小森啦啦啦
  • java虚拟机笔记(三)

    类从被加载到虚拟机内存开始到卸载内存为止,整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载

    小森啦啦啦
  • 「网站优化」网站优化如何快速优化网站到首页——一一揭秘

    网站想要优化到搜索引擎首页是必要的,但是需要下很大的功夫的。如何优化是一个所有SEOer想要学会的技巧。

    大脸猫
  • sqlplus spool 到动态日志文件名

          通过sqlplus的spool功能我们将数据库日常运维的结果输出到日志文件,而有时候则需要定时输出,为避免日志文件名的重复,我们可以将输出的日志文件...

    Leshami
  • javascript对象属性的赋值解析

    版权声明:本文为吴孔云博客原创文章,转载请注明出处并带上链接,谢谢。 https://blog.csdn.net/wkyseo/articl...

    空空云
  • 腾讯浏览指数:2017人工智能领域十大热词

    2017年人工智能的热度一直不断上升,相信在2018年会继续蓬勃发展。一个新的东西出来,总是有人觉得人工智能好,也会有人会对未来人工智能对人类是否...

    人工智能的秘密
  • 在世界顶级黑客大会,腾讯创了个纪录

    俗话说,是骡子是马,拉出来溜溜。 腾讯安全团队的一群骏马刚刚去美国拉斯维加斯溜了一圈,在世界顶级黑客大会Black Hat & DEF CON的舞台上大显身手...

    腾讯大讲堂
  • 编程语言五花八门,哪种可以让程序员赚到更多钱?

    在众多行业中,程序员属于高薪职业。无论是在国外还是国内,程序员的薪金水平普遍高于其他行业的工作岗位。高薪的诱惑和充满挑战性的工作,令程序员一直成为备受欢迎的职业...

    LiveEdu
  • 【Java入门提高篇】Java集合类详解(一)

    弗兰克的猫

扫码关注云+社区

领取腾讯云代金券