详解Spring里的Async注解实现异步操作方法

  • 更新时间:2020-05-25 14:27:40
  • 编辑:靳嘉运
给大家整理了相关的编程文章,网友向子菡根据主题投稿了本篇教程内容,涉及到spring异步注解、Spring、Async注解异步、Spring里的Async注解实现异步操作的方法步骤相关内容,已被496网友关注,如果对知识点想更进一步了解可以在下方电子资料中获取。
  • Spring Boot 2精髓:从构建小系统到架构分布式大系统 / 174.8 MB 推荐度:
  • Spring5高级编程 / 356.7 MB 推荐度:
  • 深入实践Spring Boot / 141 MB 推荐度:
  • Spring Boot 2+Thymeleaf企业应用实战 / 215.6 MB 推荐度:
  • 《Spring MVC学习指南(第2版)》配套资源 / 95.86 MB 推荐度:
  • Spring里的Async注解实现异步操作的方法步骤

    异步执行一般用来发送一些消息数据,数据一致性不要求太高的场景,对于spring来说,它把这个异步进行了封装,使用一个注解就可以实现。

    何为异步调用?

    在解释异步调用之前,我们先来看同步调用的定义;同步就是整个处理过程顺序执行,当各个过程都执行完毕,并返回结果。 异步调用则是只是发送了调用的指令,调用者无需等待被调用的方法完全执行完毕;而是继续执行下面的流程。例如, 在某个调用中,需要顺序调用 A, B, C三个过程方法;如他们都是同步调用,则需要将他们都顺序执行完毕之后,方算作过程执行完毕; 如B为一个异步的调用方法,则在执行完A之后,调用B,并不等待B完成,而是执行开始调用C,待C执行完毕之后,就意味着这个过程执行完毕了。

    @Async介绍

    在Spring中,基于@Async标注的方法,称之为异步方法;这些方法将在执行的时候,将会在独立的线程中被执行,调用者无需等待它的完成,即可继续其他的操作。

    分为不带参数的异步调用;带参数的异步调用;调用返回Future的异步线程

    @Async调用中的事务处理机制

    在@Async标注的方法,同时也适用了@Transactional进行了标注;在其调用数据库操作之时,将无法产生事务管理的控制,原因就在于其是基于异步处理的操作。 那该如何给这些操作添加事务管理呢?可以将需要事务管理操作的方法放置到异步方法内部,在内部被调用的方法上添加@Transactional. 例如: 方法A,使用了@Async/@Transactional来标注,但是无法产生事务控制的目的。 方法B,使用了@Async来标注, B中调用了C、D,C/D分别使用@Transactional做了标注,则可实现事务控制的目的。

    用法

    1.程序启动时开启@EnableAsync注解

    2.建立新的类型,建立异步方法,为方法添加@Async注解

    3.在业务代码中,@Autowired注入你的类型,使用它即可

    我们可以关注到在配置task的时候,是有参数让我们配置线程池的数量的。因为这种实现方法,所以在同一个类中的方法调用,添加@async注解是失效的!,原因是当你在同一个类中的时候,方法调用是在类体内执行的,spring无法截获这个方法调用.

    Async几种方式

    1.没有返回值的,不会阻塞主线程,相当于开启新线程在后台执行这个任务

      @Async
      public String sayHello2() throws InterruptedException {
        Thread.sleep(2 * 1000);//网络连接中 。。。消息发送中。。。
        return "我爱你啊!";// 调用方调用后会立即返回,所以返回null
      }
    

    1.带有返回值的,返回类型必须为Future<>,它会开启新的线程执行任务,并阻塞主线程,执行完成后把结果返回给主线程

     @Async
     public Future<String> asyncFunc() throws InterruptedException {
      int thinking = 2;
      Thread.sleep(thinking * 1000);
      System.out.println("async!");
      return new AsyncResult<String>("发送消息用了" + thinking + "秒");
     }
    

    调用方法

     @GetMapping("/lind-demo/asyncFunc")
     public void async() throws Exception {
      Future<String> future = null;
      future = asyncService.asyncFunc();
      System.out.println(future.get());
      System.out.println("主线程被阻塞执行完成");
     }
    

    执行结果

    async!
    发送消息用了2秒
    主线程执行完成

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持码农之家。

    相关教程

    • 介绍Python如何使用asyncio包处理并发

      这篇文章主要为大家详细介绍了Python使用asyncio包处理并发的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

      发布时间:2020-01-21

    • python用asyncio处理并发实例

      本篇文章主要介绍了python并发2之使用asyncio处理并发,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

      发布时间:2019-11-04

    • 详解async/await与promise(nodejs中的异步操作问题)

      这篇文章主要介绍了async/await与promise(nodejs中的异步操作问题),非常不错,具有参考借鉴价值,需要的朋友可以参考下

      发布时间:2020-02-08

    用户留言